9

TBitmap があり、このビットマップからトリミングされた画像を取得したい場合、「その場で」トリミング操作を実行できますか? たとえば、800x600 のビットマップがある場合、中心に 600x400 の画像が含まれるように縮小 (クロップ) するにはどうすればよいでしょうか。つまり、結果の TBitmap は 600x400 になり、(100, 100) と ( 700, 500) 元の画像で?

別のビットマップを経由する必要がありますか、それとも元のビットマップ内でこの操作を実行できますか?

4

2 に答える 2

22

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, 0, 0, W, H, InBitmap.Canvas.Handle, X, Y, SRCCOPY);
end;

そして、あなたはこのように使うことができます

Var
  Bmp : TBitmap;
begin
  Bmp:=TBitmap.Create;
  try
    CropBitmap(Image1.Picture.Bitmap, Bmp, 10,0, 150, 150);
    //do something with the cropped image
    //Bmp.SaveToFile('Foo.bmp');
  finally
   Bmp.Free;
  end;
end;

同じビットマップを使用する場合は、このバージョンの関数を試してください

procedure CropBitmap(InBitmap : TBitmap; X, Y, W, H :Integer);
begin
  BitBlt(InBitmap.Canvas.Handle, 0, 0, W, H, InBitmap.Canvas.Handle, X, Y, SRCCOPY);
  InBitmap.Width :=W;
  InBitmap.Height:=H;
end;

そして、このように使用します

Var
 Bmp : TBitmap;
begin
    Bmp:=Image1.Picture.Bitmap;
    CropBitmap(Bmp, 10,0, 150, 150);
    //do somehting with the Bmp
    Image1.Picture.Assign(Bmp);
end;
于 2012-02-07T20:52:52.290 に答える