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

Posted

技术标签:

【中文标题】在 Delphi 2007 中将具有透明度的位图保存为 PNG【英文标题】:Save Bitmap with transparency to PNG in Delphi 2007 【发布时间】:2011-01-12 15:30:10 【问题描述】:

我有一个包含透明度信息的 Delphi 位图(32 位)。我需要在保留透明度的同时将其转换并保存为 PNG 文件。

我目前拥有的工具是 graphics32 库、GR32_PNG(由 Christian Budde 提供)和 PNGImage(由 Gustavo daud 提供)。

最好的方法是什么?

编辑 1:在我的位图中不仅有一种颜色是透明的,而且需要保留具有不同透明度级别的像素。

编辑 2:我通过将图像的背景设置为 PNG 来获取带有 alpha 信息的位图,我只有一个空的 alpha 层。然后我在上面写上抗锯齿文本。然后我保存位图。使用 gimp 打开时显示透明度,放大后可以看到抗锯齿效果。

【问题讨论】:

【参考方案1】:

使用PNG图像。在 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;

如果这对您不起作用,您可能必须分别复制 alpha 和 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)不再显示任何透明度信息。【参考方案2】:

我无法让其他两个答案中的任何一个起作用。他们可能为其他人工作,但这是我所做的。

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

【讨论】:

【参考方案3】:

看看这个link

有一个功能:

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

【讨论】:

查看函数中的代码,它似乎只使一种颜色透明,而不是我需要的不同级别。 (已更新问题以明确这一点)。但是我仍然通过提供的链接创建 PNGUnit 和 PNGLib 来尝试它。调用该函数时,程序开始运行但在显示主窗体之前关闭,没有任何错误消息。感谢您迄今为止的帮助。

以上是关于在 Delphi 2007 中将具有透明度的位图保存为 PNG的主要内容,如果未能解决你的问题,请参考以下文章

Windows/C++ -- 将图标渲染为具有透明度的位图

Delphi GDI对象之绘制位图

将位图 (bmp) 转换为具有透明度的 png (Windows c++)

在 Delphi 2009 中将字符串转换为 PAnsiChar

在 Delphi 2009 中将字符串转换为 PAnsiChar

TBitmap.SaveToFile 正在更改位图