在完成其他几个相关问题之后,我无法为此提出一个有效的代码,所以请不要重复问题"标签
给定一个具有每像素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:
到目前为止的结果:
答案 0 :(得分:2)
使用透明PNG文件有两种方法:
第二种方式在透明度方面更受欢迎,因为您可能会发现将PNG加载到TBitmap32中的代码可能无法正常工作。以下是最常使用的错误代码的两个示例:
(1)来自http://graphics32.org/wiki/FAQ/ImageFormatRelated的“LoadPNGintoBitmap32” - 它应用透明度两次,因此alpha值不是0或255的图像看起来与其他软件不同(最常见的是带有玻璃效果的半透明图像)。此代码首先将alpha应用于RGB,然后设置alpha,因此当您疼痛时,将再次应用alpha。您可以在此处找到有关此问题的更多信息:Delphi, GR32 + PngObject: converting to Bitmap32 doesn't work as expected 。除此之外,它没有正确地将透明度从调色图像转换为TBitmap32的alpha图层,例如,所有白色像素都变得透明。
(2)gr32ex库中的“LoadBitmap32FromPNG”:https://code.google.com/archive/p/gr32ex/ - 与(1)相同算法的略有不同的实现,并且与(1)具有相同的问题。
如果您仍然喜欢使用TBitmap32,请执行以下步骤: