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

如何在Delphi 10.3.3 VCL中保留透明度将PNG转灰度?

带透明通道的彩色PNG转灰度PNG的Delphi 10.3.3实现方案

以下是两种基于VCL原生组件或Skia4Delphi的实现方法,均能完整保留原图像的透明通道:

一、原生VCL组件(TPngImage + TBitmap)

通过直接操作像素的方式手动计算灰度值,无需额外第三方库,适合轻量场景:

uses
  PngImage, Graphics;

procedure ConvertPngToGrayscaleWithAlpha(const SourcePng: TPngImage; out DestPng: TPngImage);
var
  Bitmap: TBitmap;
  X, Y: Integer;
  Pixels: PRGBQuad;
  GrayValue: Byte;
begin
  DestPng := TPngImage.Create;
  try
    Bitmap := TBitmap.Create;
    try
      // 设置32位像素格式以支持Alpha通道
      Bitmap.PixelFormat := pf32Bit;
      Bitmap.AlphaFormat := afPremultiplied;
      Bitmap.Assign(SourcePng);

      // 遍历所有像素处理
      for Y := 0 to Bitmap.Height - 1 do
      begin
        Pixels := Bitmap.ScanLine[Y];
        for X := 0 to Bitmap.Width - 1 do
        begin
          // 采用ITU-R BT.601标准计算灰度值,色彩还原更准确
          GrayValue := Round(0.299 * Pixels.rgbRed + 0.587 * Pixels.rgbGreen + 0.114 * Pixels.rgbBlue);
          // 保留原Alpha通道,将RGB通道统一设为灰度值
          Pixels.rgbRed := GrayValue;
          Pixels.rgbGreen := GrayValue;
          Pixels.rgbBlue := GrayValue;
          Inc(Pixels);
        end;
      end;

      // 将处理后的Bitmap转换为PNG格式
      DestPng.Assign(Bitmap);
    finally
      Bitmap.Free;
    end;
  except
    DestPng.Free;
    raise;
  end;
end;

使用示例:

var
  SrcPng, DestPng: TPngImage;
begin
  SrcPng := TPngImage.Create;
  try
    SrcPng.LoadFromFile('source.png');
    ConvertPngToGrayscaleWithAlpha(SrcPng, DestPng);
    try
      DestPng.SaveToFile('grayscale_result.png');
    finally
      DestPng.Free;
    end;
  finally
    SrcPng.Free;
  end;
end;

二、Skia4Delphi实现

Skia4Delphi提供了内置的灰度滤镜,代码更简洁且处理效率更高,适合大图像或批量处理场景:

uses
  Skia, Skia.Vcl;

procedure ConvertPngToGrayscaleWithAlpha_Skia(const SourcePath, DestPath: string);
var
  SrcBitmap: TSkBitmap;
  Paint: TSkPaint;
  DestBitmap: TSkBitmap;
begin
  SrcBitmap := TSkBitmap.Create;
  try
    // 加载带Alpha通道的源PNG
    SrcBitmap.LoadFromFile(SourcePath);
    
    Paint := TSkPaint.Create;
    try
      // 创建灰度滤镜
      Paint.ColorFilter := TSkColorFilter.MakeGrayscale;
      
      // 创建与源图像参数一致的目标Bitmap(保留Alpha类型)
      DestBitmap := TSkBitmap.Create(SrcBitmap.Width, SrcBitmap.Height, SrcBitmap.ColorType, SrcBitmap.AlphaType);
      try
        // 用带滤镜的Paint绘制源图像到目标Bitmap
        DestBitmap.Canvas.DrawBitmap(SrcBitmap, RectF(0, 0, SrcBitmap.Width, SrcBitmap.Height),
          RectF(0, 0, DestBitmap.Width, DestBitmap.Height), Paint);
        // 保存处理结果
        DestBitmap.SaveToFile(DestPath);
      finally
        DestBitmap.Free;
      end;
    finally
      Paint.Free;
    end;
  finally
    SrcBitmap.Free;
  end;
end;

注意事项:

  • 需提前安装适配Delphi 10.3.3的Skia4Delphi版本;
  • Skia会自动处理Alpha通道的预乘/非预乘转换,无需手动调整参数。

关键细节说明

  • 灰度计算优先采用ITU-R BT.601标准公式,避免简单平均RGB值导致的色彩偏差;
  • 原生方案中需确保TBitmap的AlphaFormat设置正确,否则可能丢失透明通道;
  • 测试时建议选用包含半透明区域的PNG图像,验证透明效果是否完整保留。

内容的提问来源于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.14 10:10:34