You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:05:07