|
김유미 님이 쓰신 글 :
: 화상 카메라로 사진을 찍는 프로그램을 했는데요
: 사진 보면 가로가 길고 세로가 짧잖아요
: 전 명함 사진을 만들려고 하는거라서요...
: 그래서 이미지의 오른쪽을 자르게 하거나 아니면 사진을 돌릴수 없을까 해서요
: 컴퍼넌트는 자료실에 있는 TVideoCap 을 사용했어요
잘라내는 방법은 BitBlt(빗블릿) 또는 PatBlt(팻블릿)을 이용하시면 되구요...
돌리는 방법은.. 델파이 하던시절 작성한건지 어디서 얻은건지 기억이 안나는 함수가 있네요... cpp로 변환해서 사용하세요...
보시고 참고 하시면 문제해결 간단히 하실수 있으실 겁니다..
참고적으로 bitmap rotate연산의 가장 무식한 방법이므로 화상카메라 실시간 동영상을 회전 시키기에는 무리가 있을 것입니다.. 즐플하세요..
procedure TForm1.bmp_rotate( src, dst : TBitmap; Angle : Extended );
var
c1x,c1y,c2x,c2y:integer;
p1x,p1y,p2x,p2y:integer;
radius,n:integer;
alpha:extended;
c0,c1,c2,c3:tcolor;
begin
//각도를 계산...
angle := (angle / 180) * pi;
// calculate the central points
c1x := src.width div 2;
c1y := src.height div 2;
c2x := dst.width div 2;
c2y := dst.height div 2;
// 총 Steps 수 계산...
if c2x < c2y then
n := c2y
else
n := c2x;
dec (n,1);
// 회전 시작...
for p2x := 0 to n do begin
for p2y := 0 to n do begin
if p2x = 0 then
alpha:= pi/2
else
alpha := arctan2(p2y,p2x);
radius := round(sqrt((p2x*p2x)+(p2y*p2y)));
p1x := round(radius * cos(angle+alpha));
p1y := round(radius * sin(angle+alpha));
c0 := src.canvas.pixels[c1x+p1x,c1y+p1y];
c1 := src.canvas.pixels[c1x-p1x,c1y-p1y];
c2 := src.canvas.pixels[c1x+p1y,c1y-p1x];
c3 := src.canvas.pixels[c1x-p1y,c1y+p1x];
dst.canvas.pixels[c2x+p2x,c2y+p2y]:=c0;
dst.canvas.pixels[c2x-p2x,c2y-p2y]:=c1;
dst.canvas.pixels[c2x+p2y,c2y-p2x]:=c2;
dst.canvas.pixels[c2x-p2y,c2y+p2x]:=c3;
end; //for
application.processmessages
end; //for
end;
// 사용방법...
procedure TForm1.bmpRotateClick(Sender: TObject);
var
RAngle : Extended;
begin
RAngle := StrToFloat(Edit1.Text);
bmp_rotate(Image1.Picture.Bitmap,Image2.Picture.Bitmap, RAngle);
end;
|