如果我有一个TBitmap并且我想从这个位图获得一个裁剪图像,我可以“就地”执行裁剪操作吗?例如如果我有一个800×600的位图,我怎么能减少(裁剪)它,使其包含600×400图像在中心,即得到的TBitmap是600×400,并包含由(100,100)和(700)限定的矩形,500)在原始图像?
我是否需要通过另一个位图或者可以在原始位图内完成此操作?
解决方法
您可以使用
BitBlt
功能
试试这段代码.
procedure CropBitmap(InBitmap,OutBitMap : TBitmap; X,Y,W,H :Integer); begin OutBitMap.PixelFormat := InBitmap.PixelFormat; OutBitMap.Width := W; OutBitMap.Height := H; BitBlt(OutBitMap.Canvas.Handle,H,InBitmap.Canvas.Handle,X,SRCCOPY); end;
你可以用这种方式
Var Bmp : TBitmap; begin Bmp:=TBitmap.Create; try CropBitmap(Image1.Picture.Bitmap,Bmp,10,150,150); //do something with the cropped image //Bmp.SaveToFile('Foo.bmp'); finally Bmp.Free; end; end;
如果要使用相同的位图,请尝试使用此版本的函数
procedure CropBitmap(InBitmap : TBitmap; X,H :Integer); begin BitBlt(InBitmap.Canvas.Handle,SRCCOPY); InBitmap.Width :=W; InBitmap.Height:=H; end;
并以这种方式使用
Var Bmp : TBitmap; begin Bmp:=Image1.Picture.Bitmap; CropBitmap(Bmp,150); //do somehting with the Bmp Image1.Picture.Assign(Bmp); end;