FireMonkeyアプリケーションで、Bitmapから円形に切り取り、別のBitmapに描画するには

Bitmapから円形に切り取り、別のBitmapに描画するには、TBitmap.CreateFromBitmapAndMaskを使用します。

constructor CreateFromBitmapAndMask(const Bitmap, Mask: TBitmap);

CreateFromBitmapAndMask関数は引数に画像とマスクをとります。

サンプルプログラム1

フォームにTImageを3つと、TButtonを配置します。

ImageSourceには元の画像、ImageMaskには切り取る範囲を示す画像を設定します。
ImageSourceとImageMaskの画像は同じサイズにします。

CreateFromBitmapAndMask-1

ボタンを押すと、ImageTargetに切り取った画像を表示します。

procedure TForm1.Button1Click(Sender: TObject);
begin
  ImageTarget.Bitmap := TBitmap.CreateFromBitmapAndMask(
    ImageSource.Bitmap,
    ImageMask.Bitmap);
end;

CreateFromBitmapAndMask-2

サンプルプログラム2

実行時に切り取る範囲を指定するサンプルです。

フォームにTImageを2つと、TButtonを配置します。

ImageSourceには元の画像を設定します。

CreateFromBitmapAndMask-3

マスク画像を作成します。
元の画像と同じサイズでなければなりません。

  Mask := TBitmap.Create(ImageSource.Bitmap.Width, ImageSource.Bitmap.Height);

TBitmapを編集するときは、CanvasプロパティのBeginSceneメソッドを呼びます。
編集が終わったら、CanvasプロパティのEndSceneメソッドを呼びます。

  Mask.Canvas.BeginScene;
  …
  Mask.Canvas.EndScene;

背景を黒で塗りつぶします。

  Mask.Canvas.Fill.Color := TAlphaColorRec.Black;
  Mask.Canvas.Fill.Kind := TBrushKind.Solid;
  Mask.Canvas.FillRect(TRectF.Create(0, 0, Mask.Width, Mask.Height), 0,
    0, [], 1.0);

切り取る範囲を白で塗りつぶします。

  // 白で円を描く
  Mask.Canvas.Fill.Color := TAlphaColorRec.White;
  Mask.Canvas.Fill.Kind := TBrushKind.Solid;
  Mask.Canvas.FillEllipse(TRectF.Create(0, 0, Mask.Width, Mask.Height), 1.0);

切り取った画像を作成します。

  NewBitmap := TBitmap.CreateFromBitmapAndMask(ImageSource.Bitmap, Mask);

ボタンを押すと元の画像を円形に切り取り、ImageTargetに表示します。

procedure TForm1.Button1Click(Sender: TObject);
var
  Mask, NewBitmap: TBitmap;
begin
  Mask := TBitmap.Create(ImageSource.Bitmap.Width, ImageSource.Bitmap.Height);

  Mask.Canvas.BeginScene;
  // 黒で塗りつぶす
  Mask.Canvas.Fill.Color := TAlphaColorRec.Black;
  Mask.Canvas.Fill.Kind := TBrushKind.Solid;
  Mask.Canvas.FillRect(TRectF.Create(0, 0, Mask.Width, Mask.Height), 0,
    0, [], 1.0);

  // 白で円を描く
  Mask.Canvas.Fill.Color := TAlphaColorRec.White;
  Mask.Canvas.Fill.Kind := TBrushKind.Solid;
  Mask.Canvas.FillEllipse(TRectF.Create(0, 0, Mask.Width, Mask.Height), 1.0);
  Mask.Canvas.EndScene;

  NewBitmap := TBitmap.CreateFromBitmapAndMask(ImageSource.Bitmap, Mask);
  ImageTarget.Bitmap := NewBitmap;
  NewBitmap.Free;

  Mask.Free;
end;

CreateFromBitmapAndMask-4

コメント

  1. 山本様
    切り抜き結果が描画されたbitmapをSaveToFileすると
    切り抜き領域外も黒色で表示された四角形の画像になるのですが、
    フォーム上に表示された形のまま保存は出来るのでしょうか?
    又は
    領域外の背景色を白にすることは可能でしょうか?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください