FireMonkeyでビットマップの背景を透過させるには?

解決


AiAidesAn  2013-01-09 12:11:33  No: 43617  IP: 192.*.*.*

Delphi XE2です。

グラフィックプログラミングの超初心者です。

「ビットマップ 背景 透過」について調べましたが、VCLとFireMonkeyと、グラフィック操作の知識不足でつまずいています。

読み込んだビットマップファイルの背景を透過して表示させたいのですが、
できません。というかわかりません。

目的は、2つのビットマップをオーバーレイ表示し、上の画像を透過させたいのです。

編集 削除
DEKO  2013-01-09 14:59:21  No: 43618  IP: 192.*.*.*

こんにちは。

何が "できなくて" 何が "解らない" のかがよく判りませんが、
アルファ付の Bitmap 或いは PNG を用意して、

procedure TForm1.Button1Click(Sender: TObject);
const
  SRC_FILE = 'C:\TEST1.BMP';
  DST_FILE = 'C:\TEST2.BMP';
var
  Bitmap: TBitmap;
  SrcRect, DstRect: TRectF;
begin
  Image1.Bitmap.LoadFromFile(SRC_FILE);
  Image1.Bitmap.Canvas.BeginScene;
  Bitmap := TBitmap.Create(0, 0);
  try
    Bitmap.LoadFromFile(DST_FILE);
    SrcRect := RectF(0, 0, Bitmap.Width, Bitmap.Height);
    DstRect := RectF(0, 0, Image1.Bitmap.Width, Image1.Bitmap.Height);
    Image1.Bitmap.Canvas.DrawBitmap(Bitmap, SrcRect, DstRect, 1);
  finally
    Bitmap.Free;
  end;
  Image1.Bitmap.Canvas.EndScene;
end;

こんな感じでイケると思います。

# TPaintBox やフォーム等の Canvas に描画する場合には
# OnPaint イベントハンドラ内に記述して下さい。

それとも、

[要注意コンポーネント (2)]
http://ht-deko.minim.ne.jp/ft1301.html#130105

こういう話なのでしょうか?

編集 削除
AiAidesAn  2013-01-09 16:56:29  No: 43619  IP: 192.*.*.*

DEKO様
コメント有難うございます。
何ができないか自分でもわかっていませんでした。。。

VCLの以下の処理ではbitmap2の背景が透過し、透過したところに、
bitmap1が表示されます。
この処理相当の事をFireMonkeyで行おうとしています。
procedure TForm1.FormCreate(Sender: TObject);
var
  Bitmap1 : TBitmap;
  Bitmap2 : TBitmap;
begin
  Bitmap1 := TBitmap.Create;
  Bitmap2 := TBitmap.Create;


  Bitmap1.LoadFromFile(FileName1);
  Image1.Canvas.Draw(0,0,Bitmap1);

  bitmap2.Transparent := True;

  Bitmap2.LoadFromFile(FileName2);
  Image1.Canvas.Draw(0,0,Bitmap2);
  
end;

FireMonkeyで
Image1.Bitmap.Canvas.DrawBitmap(Bitmap, SrcRect, DstRect, 1);
を行ったところBitmapが透過しませんでした。
Bitmapの背景部に元の画像が見えるような処理ができないことです。


Bitmapの背景色を透過するという処理が必要ということでしょうか?
Bitmapの背景色を透過するという処理がわからないところです。

[要注意コンポーネント (2)]は
今のところ、TIageに2つのBitmapを重ねるので、TImageの背景は勉強課題
という認識(で正しいかどうかわかっていませんが)です。

編集 削除
DEKO  2013-01-09 23:26:14  No: 43620  IP: 192.*.*.*

> FireMonkeyで
> Image1.Bitmap.Canvas.DrawBitmap(Bitmap, SrcRect, DstRect, 1);
> を行ったところBitmapが透過しませんでした。
失礼しました。
PNG は透過しますが、Bitmap は確かに透過しませんね。

編集 削除
Mr.XRAY  2013-01-10 00:49:30  No: 43621  IP: 192.*.*.*

こんにちは.

>Bitmapの背景色を透過するという処理が必要ということでしょうか?

おそらく,そうだと思います.
VCL の TBitmap のような透過のためのメソッド類はないのではないかと.
アルファ値の処理が必要ではないかと思われます.

FMX はマルチプラットホーム (?) 対応で,ビットマップは,Windows 専用の
画像形式です.
という理由からだと思います.多分ですけど.
現在は,Mac OSX でもビットマップが扱えるのかも知れませんが.

間違っていたらゴメンなさい.

編集 削除
AiAidesAn  2013-01-10 03:51:02  No: 43622  IP: 192.*.*.*

DEKO様
Mr.XRAY様
ご回答ありがとうございます。

>PNG は透過しますが、Bitmap は確かに透過しませんね

PNG利用を試してみます。
「元がBitmap」で、「透過したい画像はPNG」で試してみます。

>VCL の TBitmap のような透過のためのメソッド類はないのではないかと.
>アルファ値の処理が必要ではないかと思われます.

アルファ値の処理を試してみます。
背景の色は決まっているので、その色に対して、透明処理をしていきます。
(XE2はScanLineでできる?  試してみます。)
Mr.XRAYのHP 参考にさせていただきます。

編集 削除
Mr.XRAY  2013-01-10 11:32:33  No: 43623  IP: 192.*.*.*

>Mr.XRAYのHP 参考にさせていただきます。

えっ !? それは無理ですぜ.
私のところには,FMX (FireMonkey) 関係のサンプルはありません.
元々,画像処理関係の参考となる記事そのものがほとんどありませんので.

編集 削除
AiAidesAn  2013-01-11 05:46:14  No: 43624  IP: 192.*.*.*

動作的には意図するものができましたが、正しい方法か
どうかは要調査です。。。

背景が黒のbitmapfileの背景を透過しました。
Image1の背面に配置したImageがImage1の背景越しに表示
されているように見えます。

BM := TBitmap.Create(0,0);
BM.LoadFromFile(bitmapfile);

for Y := 0 to BM.Height - 1 do
  begin
  ScanArray :=  PAlphaColorArray(BM.ScanLine[Y]);
  for X := 0 to BM.Width - 1 do
  begin
    PixelColor := BM .Pixels[X,Y];
    if PixelColor = claBlack then
     begin
       ScanArray[X] := 0;
     end;
  end;
end;

Image1.Bitmap.Canvas.BeginScene;
 
Image1.Bitmap.Canvas.DrawBitmap(BM ,
                                RectF(0,
                                      0,
                                      BM.Width,
                                      BM.Height),
                                RectF(0,
                                      0,
                                      Image1.Bitmap.Width,
                                      Image1.Bitmap.Height),
                                 1);
BM .Free;

Image1.Bitmap.Canvas.EndScene;


Mr.XRAY様のHP参考にさせていただきました。

>PNG は透過しますが、Bitmap は確かに透過しませんね。
アルファ付のPNGの準備を次の課題として、透過処理を行うことにしました。

解決みとして調査を続けます。
回答ありがとうございました。

編集 削除
Mr.XRAY  2014-02-07 22:20:57  No: 43625  IP: 192.*.*.*

>読み込んだビットマップファイルの背景を透過して表示させたいのですが、

ビットマップの背景とありますが,スレッドの話の流れから,
ビットマップ画像の一部を透過したいのではないかと解釈しました.

サンプルを書いてみましたので,他の方にも参考になれば.

[06_FireMonkey における画像の透過処理]
http://mrxray.on.coocan.jp/Delphi/plSamples/690_TextOnImage.htm#06

編集 削除