Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 从位图转换时,PNG将失去透明度_Delphi_Png_Imaging - Fatal编程技术网

Delphi 从位图转换时,PNG将失去透明度

Delphi 从位图转换时,PNG将失去透明度,delphi,png,imaging,Delphi,Png,Imaging,我将一个png文件加载到一个TPNGImage中,然后在一个TImage中显示它。没问题。然后我创建一个TBitmap并将其分配给TPNGImage,并在一个时间段中显示它。没问题 然后我创建第二个TPNGImage并将其分配给TBitmap。在这种情况下,如果我在图像中显示它,它就失去了透明度。如果我将TBitmap.Transparent设置为True,在分配给PNGImage之前,PNGImage大部分是透明的,但是有一个小区域的透明度丢失,显示为黑色 var Bmp: TBitmap

我将一个png文件加载到一个TPNGImage中,然后在一个TImage中显示它。没问题。然后我创建一个TBitmap并将其分配给TPNGImage,并在一个时间段中显示它。没问题

然后我创建第二个TPNGImage并将其分配给TBitmap。在这种情况下,如果我在图像中显示它,它就失去了透明度。如果我将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;
结果不设置位图。透明为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)有一个“通道对话框”。此外,在“首选项->显示”中还有棋盘格设置。