[PNG从位图转换时失去透明度

问题描述 投票:0回答:1

我将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;

未将位图设置为透明的结果:

enter image description here

当我将Bitmap.Transparent设置为True时的结果:图像中有一小部分黑色

enter image description here

如何在不丢失any透明度的情况下将PNGImage分配给位图?

delphi png imaging
1个回答
0
投票

我只能推测...但是PNG支持部分透明性,而24位位图则不支持。而且由于剩余的“黑色”像素不是黑色的(它们是$ 000101),我怀疑这些像素在原始png中是半透明的。在转换为位图时,已应用该效果或某些抗锯齿效果。但我相信半透明的可能性更大。

我从未真正使用32位位图,但是也许可以使用它们来保持透明度。 (他们确实有一个Alpha通道...)。但是我怀疑这可能不仅仅是Bitmap.Assign还要棘手。

© www.soinside.com 2019 - 2024. All rights reserved.