Delphi 从位图转换时,PNG将失去透明度
我将一个png文件加载到一个TPNGImage中,然后在一个TImage中显示它。没问题。然后我创建一个TBitmap并将其分配给TPNGImage,并在一个时间段中显示它。没问题 然后我创建第二个TPNGImage并将其分配给TBitmap。在这种情况下,如果我在图像中显示它,它就失去了透明度。如果我将TBitmap.Transparent设置为True,在分配给PNGImage之前,PNGImage大部分是透明的,但是有一个小区域的透明度丢失,显示为黑色Delphi 从位图转换时,PNG将失去透明度,delphi,png,imaging,Delphi,Png,Imaging,我将一个png文件加载到一个TPNGImage中,然后在一个TImage中显示它。没问题。然后我创建一个TBitmap并将其分配给TPNGImage,并在一个时间段中显示它。没问题 然后我创建第二个TPNGImage并将其分配给TBitmap。在这种情况下,如果我在图像中显示它,它就失去了透明度。如果我将TBitmap.Transparent设置为True,在分配给PNGImage之前,PNGImage大部分是透明的,但是有一个小区域的透明度丢失,显示为黑色 var Bmp: TBitmap
var
Bmp: TBitmap;
PngImage: TPNGImage;
PngImage2: TPNGImage;
begin
PngImage := TPNGImage.Create;
try
PngImage.LoadFromFile(FILE_NAME);
Image1.Picture.Assign(PngImage);
Bmp := TBitmap.Create;
try
Bmp.Assign(PngImage);
Image2.Picture.Assign(Bmp);
PngImage2 := TPNGImage.Create;
try
//Bmp.Transparent := True;
PngImage2.Assign(Bmp);
Image3.Picture.Assign(PngImage2);
finally
PngImage2.Free;
end;
finally
Bmp.Free;
end;
finally
PngImage.Free;
end;
end;
结果不设置位图。透明为True:
设置位图时的结果。透明为真:图像中有少量黑色
如何在不丢失任何透明度的情况下将图像分配给位图?我只能推测。。。但PNG支持部分透明,而24位位图则不支持。由于剩余的“黑色”像素不是黑色的(它们是$000101),我怀疑这些像素在原始png中是半透明的。或者在转换为位图时应用了某种反序列化效果。但我相信半透明的可能性更大
我从未真正使用过32位位图,但也许它们可以用来保持透明度。(他们有一个阿尔法通道…)。但我怀疑这可能比位图.Assign更棘手。我可以证实@SertacAkyuz在评论中说的话。以下方面没有问题:
Bmp.Assign(PngImage);
结果是一个32位图像,保留alpha通道。问题在于
PngImage2.Assign(Bmp);
阿尔法消失的地方
我发现此库有助于转换:
使用内置代码可能无法轻松解决此问题。您将需要编写自己的代码来从PNG传输到32bpp位图,或者找到一个库来实现这一点,但这不是teivial。简单的分配是行不通的。即使您将png转换为带有alpha的32位位图,也不能将其指定给TImage,您需要自定义绘制它。真正的问题是,当您已经有了TPngImage并且可以将其分配给TImage时,为什么还要乱处理TBitmap?
TransparentColor
用于非透明位图,它与您的问题无关。实际情况是,所讨论的位图是32位的,具有alpha通道。但是pngimage不支持从位图的赋值中传输alpha。@SertacAkyuz:将32位位图保存到文件时会发生什么?它会移除alpha通道吗?我这样做了,然后尝试在Gimp中打开图像。它没有显示alpha通道。@Rael-我在评论之前做了相同的测试,就在Bmp.Assign(PngImage)之后代码>我插入了Bmp.SaveToFile()
。Alpha保持不变,最初使用XnView检查,但现在我也使用Gimp检查。XnView有此设置“使用Alpha通道”。我可以用它来查看alpha频道。Gimp中是否有等价物?在Gimp中,似乎没有alpha通道…我使用的版本(2.6.12)有一个“通道对话框”。此外,在“首选项->显示”中还有棋盘格设置。