从位图转换时,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 丢失的地方。

我发现这个库可以帮助转换:

https://github.com/graphics32/GR32PNG