在 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的主要内容,如果未能解决你的问题,请参考以下文章
将位图 (bmp) 转换为具有透明度的 png (Windows c++)
在 Delphi 2009 中将字符串转换为 PAnsiChar