Delphi XE2です。
グラフィックプログラミングの超初心者です。
「ビットマップ 背景 透過」について調べましたが、VCLとFireMonkeyと、グラフィック操作の知識不足でつまずいています。
読み込んだビットマップファイルの背景を透過して表示させたいのですが、
できません。というかわかりません。
目的は、2つのビットマップをオーバーレイ表示し、上の画像を透過させたいのです。
こんにちは。
何が "できなくて" 何が "解らない" のかがよく判りませんが、
アルファ付の 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
こういう話なのでしょうか?
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の背景は勉強課題
という認識(で正しいかどうかわかっていませんが)です。
> FireMonkeyで
> Image1.Bitmap.Canvas.DrawBitmap(Bitmap, SrcRect, DstRect, 1);
> を行ったところBitmapが透過しませんでした。
失礼しました。
PNG は透過しますが、Bitmap は確かに透過しませんね。
こんにちは.
>Bitmapの背景色を透過するという処理が必要ということでしょうか?
おそらく,そうだと思います.
VCL の TBitmap のような透過のためのメソッド類はないのではないかと.
アルファ値の処理が必要ではないかと思われます.
FMX はマルチプラットホーム (?) 対応で,ビットマップは,Windows 専用の
画像形式です.
という理由からだと思います.多分ですけど.
現在は,Mac OSX でもビットマップが扱えるのかも知れませんが.
間違っていたらゴメンなさい.
DEKO様
Mr.XRAY様
ご回答ありがとうございます。
>PNG は透過しますが、Bitmap は確かに透過しませんね
PNG利用を試してみます。
「元がBitmap」で、「透過したい画像はPNG」で試してみます。
>VCL の TBitmap のような透過のためのメソッド類はないのではないかと.
>アルファ値の処理が必要ではないかと思われます.
アルファ値の処理を試してみます。
背景の色は決まっているので、その色に対して、透明処理をしていきます。
(XE2はScanLineでできる? 試してみます。)
Mr.XRAYのHP 参考にさせていただきます。
>Mr.XRAYのHP 参考にさせていただきます。
えっ !? それは無理ですぜ.
私のところには,FMX (FireMonkey) 関係のサンプルはありません.
元々,画像処理関係の参考となる記事そのものがほとんどありませんので.
動作的には意図するものができましたが、正しい方法か
どうかは要調査です。。。
背景が黒の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の準備を次の課題として、透過処理を行うことにしました。
解決みとして調査を続けます。
回答ありがとうございました。
>読み込んだビットマップファイルの背景を透過して表示させたいのですが、
ビットマップの背景とありますが,スレッドの話の流れから,
ビットマップ画像の一部を透過したいのではないかと解釈しました.
サンプルを書いてみましたので,他の方にも参考になれば.
[06_FireMonkey における画像の透過処理]
http://mrxray.on.coocan.jp/Delphi/plSamples/690_TextOnImage.htm#06