拷贝矩形用bitblt,拷贝圆和椭圆呢?(50分)

  • 主题发起人 主题发起人 Caicheng
  • 开始时间 开始时间
C

Caicheng

Unregistered / Unconfirmed
GUEST, unregistred user!
BITBLT 也可以做到!不过我也想知道有什么更好的方法!
我来听课!
 
拷贝位图还可以用CopyRect()啊!
 
至于非矩形的拷贝,一般还是运用 BitBlt 来实现的;
不过你需要首先创建区域,然后 SelectClipRgn 就OK 。

小小例子:

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Bmp :TBitmap;
FRgn :HRGN;
begin
Bmp :=TBitmap.Create;
Bmp.PixelFormat :=Image1.Picture.Bitmap.PixelFormat;
Bmp.Width :=100;
Bmp.Height :=100;
BitBlt(Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,Image1.Canvas.Handle,80,80,SRCCOPY); //要拷贝的位图
FRgn :=CreateEllipticRgn(0,0,100,100);
SelectClipRgn(Image1.Canvas.Handle,FRgn);
Image1.Canvas.Draw(0,0,Bmp);
Bmp.Free;
DeleteObject(FRgn);
end;
 
另一种方法:
利用扫描线,记录你需要拷贝圆的每行的信息,只是稍嫌麻烦;但是速度不存在问题;
因为前一种方法里的 BitBlt 毕竟是象素级操作 .
 
还是用BITBLT COPY矩形到一临时BITMAP, 然后在上面画圆,以单色填充圆以外部分作为
背景色,以背景色为透明色,将此BITMAP BITBLT到你想要的地方.
 
卷起千堆雪tyn的方法毕竞还是要先拷整张图,不理想
 
分数不多,谢谢各位。
 
多人接受答案了。
 
后退
顶部