[英]Delphi: GR32 draw a PNG with alpha onto a TBitmap32 without clearing its content
经历了其他几个相关问题之后,我无法为此提供有效的代码,因此请保留“重复问题”标签。
给定具有每个像素Alpha通道或单色透明性的PNG图像,我需要代码将其绘制到已经包含图像的TBitmap32上(在PNG部件之前进行一些绘制)。 假设我的TBitmap32是200x200,我在上面做了一些绘图,然后我想根据其PNG的Alpha通道数据或单色Alpha透明地在其当前内容之上插入一个较小的透明PNG图像。
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文件的方式:
关于透明度,第二种方法更可取,因为您可能会发现将PNG加载到TBitmap32中的代码可能无法正常工作。 这是两个最常使用的错误代码的示例:
(1)来自http://graphics32.org/wiki/FAQ/ImageFormatRelated的 “ LoadPNGintoBitmap32”-它两次应用透明度,因此alpha值不是0或255的图像看起来与其他软件有所不同(在半透明状态下最明显)具有玻璃效果的图像)。 该代码将首先将alpha应用于RGB,然后设置alpha,因此当您感到痛苦时,将再次应用alpha。 您可以在此处找到有关此问题的更多信息: Delphi,GR32 + PngObject:转换为Bitmap32不能正常工作 。 除此之外,它不能将调色板图像的透明度正确转换为TBitmap32的alpha层,例如,所有白色像素都变为透明。
(2)来自gr32ex库的“ LoadBitmap32FromPNG”: https : //code.google.com/archive/p/gr32ex/-与(1)相同算法的实现略有不同,并且与(1)相同。
如果仍然喜欢使用TBitmap32,请执行以下步骤序列:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.