在Delphi 2007中将带透明度的位图保存为PNG

3
我有一个带有透明信息的 Delphi 位图(32位),我需要将其转换并保存为 PNG 文件,同时保留透明度。目前我拥有的工具是 graphics32 库、GR32_PNG(由 Christian Budde 开发)和 PNGImage(由 Gustavo daud 开发)。最佳实现方案是什么?
编辑1:我的位图中不只是一种颜色是透明的,还有各种透明度级别的像素需要被保留。
编辑2:我通过将图像的背景设置为空 alpha 层的 PNG 图片,然后在其上写入抗锯齿文本来获取带有 alpha 信息的位图。之后我保存该位图。在使用 GIMP 打开时会显示透明度,并且放大可以看到抗锯齿效果。
3个回答

4

使用PNGImage。在Delphi中,可以尝试以下方法:

function ConvertToPNG(oBMPSrc: TBitmap; sFilename: String);
var
  oPNGDest: TPNGObject;
begin
  oPNGDest := TPNGObject.Create;
  try
    oPNGDest.Assign(oBMPSrc);
    oPNGDest.SaveToFile(sFilename); 
  finally
    oPNGDest.Free;
  end;
end;

如果那不适用于您,您可能需要逐个复制α值和RGB值。
function ConvertToPNG(oBMPSrc: TBitmap; sFilename: String);
var
  oPNGDest: TPNGObject;
begin
  oPNGDest := TPNGObject.CreateBlank(COLOR_RGBALPHA, 8, oBMPSrc.Width, oBMPSrc.Height);
  try
    oPNGDest.CreateAlpha;
    // Copy over RGB
    ..
    // Copy over Alpha
    ..
    // Save to file
    oPNGDest.SaveToFile(sFilename); 
  finally
    oPNGDest.Free;
  end;
end;

如果我在程序中包含PNGImage单元,那么我创建的保存位图(请查看主问题中的EDIT 2)将不再显示任何透明信息。 - Tim

3

我无法让另外两个答案起作用。它们可能适用于其他人,但是这是我所做的。

  1. 我创建了具有透明度的位图。
  2. 将其分配给来自Graphics 32库的TBitmap32。
  3. 将其分配给Christian Budde的GR32_PNG for Graphics32中的TPortableNetworkGraphics32。
  4. 调用TPortableNetworkGraphics32.SaveToFile方法。

1

看看这个链接

有一个函数:

function WriteBitmapToPngFile( Filename : string; Bitmap : TBitmap; TransparentColor:TColor):boolean;

从函数的代码来看,它似乎只能使一个颜色透明,而我需要的是不同程度的透明度(已更新问题以澄清此点)。但是我仍然尝试了根据提供的链接创建PNGUnit和PNGLib。调用函数时,程序开始运行,但在显示主窗体之前就关闭了,没有任何错误消息。非常感谢您到目前为止的帮助。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接