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

前回の続きです。

マスクが適用されたTBitmapを保存すると、切り取られた部分が透明色になります。

次のコートはTImageの画像を円形で切り取り、ファイルに保存します。
保存されたファイルを確認すると、切り取られた部分が透明になっていることがわかります。

procedure TForm1.ButtonSaveToFileClick(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);
  NewBitmap.SaveToFile('C:\tmp\test.png');
  NewBitmap.Free;
  Mask.Free;
end;

CreateFromBitmapAndMask-4

画像をCanvas上に描画するには、TCanvasクラスのDrawBitmapメソッドを使用します。

次のコードでは、赤色で塗りつぶしたCanvasの上に先ほど保存した画像を描画します。

procedure TForm1.ButtonDrawBitmapClick(Sender: TObject);
var
  NewBitmap: TBitmap;
begin
  NewBitmap := TBitmap.CreateFromFile('C:\tmp\test.png');

  // 赤で塗りつぶす
  ImageTarget.Bitmap.SetSize(NewBitmap.Width, NewBitmap.Height);
  ImageTarget.Bitmap.Canvas.BeginScene;
  ImageTarget.Bitmap.Canvas.Fill.Color := TAlphaColorRec.Red;
  ImageTarget.Bitmap.Canvas.Fill.Kind := TBrushKind.Solid;
  ImageTarget.Bitmap.Canvas.FillRect(TRectF.Create(0, 0, NewBitmap.Width,
    NewBitmap.Height), 0, 0, [], 1.0);

  // Bitmapを描画する
  ImageTarget.Bitmap.Canvas.DrawBitmap(NewBitmap,
    TRectF.Create(0, 0, NewBitmap.Width, NewBitmap.Height),
    TRectF.Create(0, 0, ImageTarget.Bitmap.Width,
    ImageTarget.Bitmap.Height), 1.0);
  ImageTarget.Bitmap.Canvas.EndScene;

  NewBitmap.Free;
end;

CreateFromBitmapAndMask-5

CreateFromBitmapAndMask-6

背景色はお好きな色をお使いください。

コメント

  1. 山本様
    前回のページに質問させていただいた者です。
    こちらの情報を参考にさせていただき、期待する画像ができました。
    ありがとうございました。
    ※質問後も前回のページのみ見ていて、このページの存在に気がつきませんでした。
    お礼が遅くなりすみません。

コメントを残す

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

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