当前位置: 首页 > 知识库问答 >
问题:

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

仇正平
2023-03-14

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

然后我创建第二个TPNGImage并将其分配给TBitmap。在这种情况下,如果我在TImage中显示它,它就失去了透明度。如果我设置了TBitmap。透明到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;

结果不设置位图。透明到真实:

当我设置位图时的结果。透明到真实:图像中有一点黑色

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

共有2个答案

龚盛
2023-03-14

我可以证实@SertacAkyuz在评论中说的话。以下方面没有问题:

Bmp.Assign(PngImage);

结果是一个32位的图像,保留了alpha通道。问题在于

PngImage2.Assign(Bmp);

阿尔法迷失的地方。

我发现这个库有助于转换:

https://github.com/graphics32/GR32PNG

吴宝
2023-03-14

我只能推测。。。但是png支持部分透明,而24位位图不支持。由于剩余的“黑色”像素不是黑色的(它们是$000101),我怀疑这些像素在原始png中是半透明的。或者在转换为位图时应用了一些反序列化效果。但我认为半透明的可能性更大。

我从未真正使用过32位位图,但也许它们可以用来保持透明度。(他们确实有阿尔法通道…)。但我怀疑这可能比位图更棘手。分配

 类似资料:
  • 我的任务是: 创建一个TBitmap对象 如何在Delphi XE中做到这一点?

  • 问题内容: 我有一个Android应用程序,可将图像加载为位图并将其显示在ImageView中。问题在于图像似乎具有透明背景;这会导致图像上的某些黑色文本在黑色背景下消​​失。 如果将ImageView背景设置为白色,则可以完成这种工作,但是在图像上会出现丑陋的大边框,将其拉伸以适合父对象(实际图像在中间缩放)。 所以-我想将位图中的透明像素转换为纯色-但我不知道该怎么做! 任何帮助将不胜感激!

  • 问题内容: 嘿,当我从png创建缩略图时,尝试保持png的透明度时遇到麻烦,有人对此有任何经验吗?任何帮助都会很棒,这是我目前正在做的事情: 问题答案: 过去,我已经成功地做到了: 我发现输出图像使用质量更好的比

  • 我正试图重新设计我的网站,使我原来的方形、基于瓷砖的图像渲染更像是图像的剪贴画。。。为了摆脱网格模式。 这是它最初的样子。。。 这是我想要的一个粗略的模型: 所以我重新保存了一个透明背景的图像缩略图。。。我只想让狗展示,正方形是透明的,可以在下面显示网站的背景。 然而,当我在页面上呈现它时,它的背景是黑色的。 我已经检查了我的CSS,看看是否有某种img类,或用于渲染漫画的类。。。甚至可以通过引导

  • 我试图拖动对象表示为PNG图像透明背景从AnchorPane到HBox。 我使用以下线条将图像设置为拖动视图: 对于不透明的背景图像,这一切都很好,但对于透明的图像,图像的背景是白色的,不透明度为“0.8”。 我尝试为节点拍摄快照: 但它不起作用,白色背景仍然存在。有没有其他方法可以让它像原始图像一样透明?

  • 我创建了一个对话框,用户可以在其中浏览图像,然后看到画布上绘制的图像的预览。图像被缩放,以便在框中安装时保持其宽高比。我使用了在这个答案中找到的调整大小的方法,包括将图像从SWT转换为AWT,执行调整大小,从AWT转换回SWT,最后在画布上绘制。由于这个过程在时间和处理能力方面非常昂贵,如果图像大小完全正确,我选择跳过调整大小的步骤,因此不需要以任何方式进行转换。 在处理alpha透明的图像时会出