我将png文件加载到TPNGImage中,然后将其显示在TImage中。没问题。然后,我创建一个TBitmap并将其分配给TPNGImage,并将其显示在TImage中。没问题。
然后创建第二个TPNGImage并将其分配给TBitmap。在这种情况下,如果我在TImage中显示它,它将失去透明度。如果我将TBitmap.Transparent设置为True,则在分配给PNGImage之前,PNGImage大部分是透明的,但是有一小部分区域失去了透明性,显示为黑色。
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;
未将位图设置为透明的结果:
当我将Bitmap.Transparent设置为True时的结果:图像中有一小部分黑色
如何在不丢失any透明度的情况下将PNGImage分配给位图?
我只能推测...但是PNG支持部分透明性,而24位位图则不支持。而且由于剩余的“黑色”像素不是黑色的(它们是$ 000101),我怀疑这些像素在原始png中是半透明的。在转换为位图时,已应用该效果或某些抗锯齿效果。但我相信半透明的可能性更大。
我从未真正使用32位位图,但是也许可以使用它们来保持透明度。 (他们确实有一个Alpha通道...)。但是我怀疑这可能不仅仅是Bitmap.Assign还要棘手。