从位图转换时,PNG 失去透明度
PNG loses transparency when converting from a Bitmap
我将一个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 的结果:
将Bitmap.Transparent设置为True时的结果:图像中有一点黑色
如何在不丢失 任何 透明度的情况下将 PNGImage 分配给位图?
我只能推测...但是 PNG 支持部分透明,而 24 位位图不支持。由于剩余的 "black" 像素不是黑色(它们是 $000101),我怀疑这些像素在原始 png 中是半透明的。那个,或者在转换为位图时应用了一些抗锯齿效果。但我认为半透明的可能性更大。
我从来没有真正使用过 32 位位图,但也许它们可以用来保持透明度。 (他们确实有一个 alpha 通道......)。但我怀疑它可能比 Bitmap.Assign.
更棘手
我可以确认@SertacAkyuz 在评论中所说的内容。没有问题:
Bmp.Assign(PngImage);
结果是保留 alpha 通道的 32 位图像。问题出在
PngImage2.Assign(Bmp);
alpha 丢失的地方。
我发现这个库可以帮助转换:
我将一个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 的结果:
将Bitmap.Transparent设置为True时的结果:图像中有一点黑色
如何在不丢失 任何 透明度的情况下将 PNGImage 分配给位图?
我只能推测...但是 PNG 支持部分透明,而 24 位位图不支持。由于剩余的 "black" 像素不是黑色(它们是 $000101),我怀疑这些像素在原始 png 中是半透明的。那个,或者在转换为位图时应用了一些抗锯齿效果。但我认为半透明的可能性更大。
我从来没有真正使用过 32 位位图,但也许它们可以用来保持透明度。 (他们确实有一个 alpha 通道......)。但我怀疑它可能比 Bitmap.Assign.
更棘手我可以确认@SertacAkyuz 在评论中所说的内容。没有问题:
Bmp.Assign(PngImage);
结果是保留 alpha 通道的 32 位图像。问题出在
PngImage2.Assign(Bmp);
alpha 丢失的地方。
我发现这个库可以帮助转换: