【发布时间】:2023-12-20 20:48:01
【问题描述】:
在解决了其他几个相关问题后,我无法为此提供有效的代码,因此请保留“重复问题”标签。
给定一个具有每像素 Alpha 通道或单色透明度的 PNG 图像,我需要代码将其绘制到已经包含图像的 TBitmap32 上(一些绘图在 PNG 部分之前进行)。所以假设我的 TBitmap32 是 200x200,我在上面画了一些图,然后我想在其当前内容之上插入一个较小的透明 PNG 图像,根据 PNG 的 alpha 通道数据或单色 alpha 透明地插入。
Uses pngimage, GR32;
procedure TForm1.Button1Click(Sender: TObject);
Var b: TBitmap;
b32: TBitmap32;
p: TPngImage;
begin
b := TBitmap.Create;
b32 := TBitmap32.Create;
p := TPngImage.Create;
// 50x50 PNG
p.LoadFromFile('z:\test2.png');
b.Width := 200;
b.Height := 200;
b32.Width := 200;
b32.Height := 200;
// some drawing happens on the b32~
// insert code here to draw the png onto the b32, on top of
// what's already drawn, and at specific coordinates i.e 10,10
/////////////////////////////
b32.DrawTo(b.Canvas.Handle,0,0);
Canvas.Draw(0,0,b);
p.Free;
b32.Free;
b.Free;
end;
原始PNG:
目前的结果:
【问题讨论】:
-
那么有什么不符合您的预期?我看到绿色图片很好地融入了黑色背景,因此保持了 PNG alpha 透明度。是黑色背景的问题吗?如果是,您是否在对其进行任何绘图之前用透明颜色填充了整个 bm32 位图。我假设新位图的默认颜色可能是黑色或白色,并且可能完全不透明。
-
黑色区域应该是透明的,混合在下面的另一个bitmap32上(红色)
-
Nvm it.. 我很愚蠢,最明显和最简单的步骤意外地完成了这项工作:p.Draw(b32.Canvas,Rect(50,100,150,200)); Delphi Seattle 的 TPngImage 版本完美地完成了这项工作:i.imgur.com/yb56ezN.png
标签: delphi png transparent alpha