Delphi 10.3.3 VCL中PNG转TBitmap如何保留透明度?
解决Delphi VCL中PNG转TBitmap再转回PNG丢失透明度的问题
原生VCL解决方案
问题根源是默认创建的TBitmap未启用Alpha通道支持,导致透明区域被填充为黑色。修改代码时需显式配置TBitmap的像素格式与Alpha属性:
var InputPNG: TPngImage; OutputPNG: TPngImage; BMP: TBitmap; begin InputPNG := TPngImage.Create; OutputPNG := TPngImage.Create; BMP := TBitmap.Create; try InputPNG.LoadFromFile('C:\input.png'); // 配置BMP支持Alpha通道 BMP.PixelFormat := pf32bit; BMP.AlphaFormat := afPremultiplied; BMP.SetSize(InputPNG.Width, InputPNG.Height); // 正确绘制PNG到BMP,保留透明度 BMP.Canvas.Brush.Style := bsClear; BMP.Canvas.Draw(0, 0, InputPNG); // 转回PNG并保存 OutputPNG.Assign(BMP); OutputPNG.SaveToFile('C:\output.png'); finally InputPNG.Free; OutputPNG.Free; BMP.Free; end; end;
关键改动:
- 将
TBitmap的PixelFormat设为pf32bit,启用含Alpha通道的32位颜色模式 - 设置
AlphaFormat为afPremultiplied,匹配PNG的Alpha预乘格式 - 用
Canvas.Draw替代Assign,避免默认赋值操作丢失透明信息 - 新增
try...finally确保资源安全释放
Skia4Delphi解决方案
Skia4Delphi对图片透明度的处理更简洁,无需手动配置通道,适合复杂图形操作:
确保已安装Skia4Delphi组件后,使用以下代码:
uses Skia, Skia.Vcl; var InputBitmap: TSkBitmap; begin InputBitmap := TSkBitmap.Create; try // 加载PNG InputBitmap.LoadFromFile('C:\input.png'); // 在这里对图片进行修改操作(示例:绘制半透明红色矩形) InputBitmap.Canvas.BeginPaint; try InputBitmap.Canvas.FillColor := TSkColors.SetAlpha(TSkColors.Red, 128); InputBitmap.Canvas.DrawRect(TRectF.Create(10, 10, 100, 100)); finally InputBitmap.Canvas.EndPaint; end; // 保存为PNG InputBitmap.SaveToFile('C:\output.png', TSkEncodedImageFormat.PNG); finally InputBitmap.Free; end; end;
优势:
- 原生支持PNG透明度,无需额外配置
- 提供丰富图形操作API(滤镜、路径绘制等)
- 格式转换更高效,避免VCL原生组件的兼容性问题
内容的提问来源于stack exchange,提问作者Xel Naga
相关产品推荐
相关产品推荐

