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

如何使用Delphi将SVG文件转换为带透明通道的PNG文件

解决Delphi+Skia4Delphi转换SVG到PNG时透明背景变黑的问题

你的代码里有几个关键问题导致透明效果丢失:

  • 普通TBitmap的Transparent := True只是设置单一透明色,不支持真正的Alpha通道;
  • 渲染SVG前没清空画布为透明,Skia会用默认的黑色填充未绘制区域;
  • 用TPngImage.Assign(LBitmap)的方式可能无法正确保留Alpha通道信息。

下面是修正后的代码:

var
  LBitmap: TBitmap;
  LSkPng: TSkPngImage;
begin
  if OpenDialog1.Execute then
  begin
    LBitmap := TBitmap.Create;
    try
      // 设置Bitmap为支持Alpha通道的格式
      LBitmap.PixelFormat := pf32bit;
      LBitmap.AlphaFormat := afPremultiplied;
      LBitmap.SetSize(1000, 1000);

      LBitmap.SkiaDraw(
        procedure (const ACanvas: ISKCanvas)
        var
          LSvgBrush: TSkSvgBrush;
        begin
          // 先清空画布为透明背景
          ACanvas.Clear(SKColors.Transparent);
          
          LSvgBrush := TSkSvgBrush.Create;
          try
            LSvgBrush.Source := TFile.ReadAllText(OpenDialog1.FileName);
            LSvgBrush.Render(ACanvas, RectF(0, 0, LBitmap.Width, LBitmap.Height), 1);
          finally
            LSvgBrush.Free;
          end;
        end);

      if SaveDialog1.Execute then
      begin
        // 用Skia自带的TSkPngImage直接保存,更可靠地保留透明
        LSkPng := TSkPngImage.Create;
        try
          LSkPng.Encode(LBitmap.SkiaImage);
          LSkPng.SaveToFile(SaveDialog1.FileName);
        finally
          LSkPng.Free;
        end;
      end;
    finally
      LBitmap.Free;
    end;
  end;
end;

关键修改点说明:

  • 给TBitmap设置PixelFormat := pf32bit和AlphaFormat := afPremultiplied,确保它能存储Alpha通道信息;
  • 在渲染SVG前调用ACanvas.Clear(SKColors.Transparent),把画布初始化为完全透明;
  • 使用Skia原生的TSkPngImage来编码保存,替代TPngImage.Assign,避免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.08.20 20:54:17