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

如何借助Skia框架在Delphi中将位图转换为单色位图?

Delphi + Skia 实现PNG转单色位图(打印用)

针对打印场景的纯黑纯白单色位图转换,你可以通过Skia的颜色滤镜组合实现:先将彩色图转灰度,再通过阈值过滤把灰度值映射为黑白两色,具体实现步骤如下:

1. 加载源PNG图片

用Skia的TSkBitmap加载本地PNG文件:

var
  LSourceBitmap: TSkBitmap;
begin
  LSourceBitmap := TSkBitmap.Create;
  try
    if not LSourceBitmap.LoadFromFile('你的本地PNG路径.png') then
    begin
      ShowMessage('图片加载失败');
      Exit;
    end;
    // 后续处理逻辑
  finally
    LSourceBitmap.Free;
  end;
end;

2. 组合滤镜生成单色效果

通过两个颜色滤镜的组合完成转换:

  • 灰度滤镜:去除图片饱和度,将彩色转为灰度图
  • 阈值滤镜:把灰度值映射为纯黑或纯白(可根据打印需求调整阈值)

代码示例:

var
  LGrayFilter, LThresholdFilter, LCombinedFilter: TSkColorFilter;
  LMonochromeBitmap: TSkBitmap;
begin
  // 创建灰度滤镜(基于Skia内置的灰度矩阵)
  LGrayFilter := TSkColorFilter.MakeMatrix(SkiaGrayscaleMatrix);
  // 创建阈值滤镜:灰度值>127转为白色,<=127转为黑色(阈值范围0-255)
  LThresholdFilter := TSkColorFilter.MakeThreshold(TSkColorChannel.kGray, 127, $FFFFFFFF, $FF000000);
  // 组合两个滤镜,先转灰度再应用阈值
  LCombinedFilter := TSkColorFilter.MakeCompose(LGrayFilter, LThresholdFilter);

  // 创建目标单色位图,尺寸与源图一致,选择适合打印的1位灰度类型
  LMonochromeBitmap := TSkBitmap.Create(LSourceBitmap.Width, LSourceBitmap.Height, TSkColorType.k1Gray);
  try
    // 用组合滤镜绘制源图到目标位图
    LMonochromeBitmap.Canvas.DrawBitmap(LSourceBitmap, 0, 0, nil, LCombinedFilter);
    // 保存为打印可用的格式(如PNG或BMP)
    LMonochromeBitmap.SaveToFile('单色输出.png');
  finally
    // 释放所有Skia对象,避免内存泄漏
    LMonochromeBitmap.Free;
    LCombinedFilter.Free;
    LThresholdFilter.Free;
    LGrayFilter.Free;
  end;
end;

3. 关键调整点

  • 阈值优化:如果打印出来的黑白对比不符合预期,可修改阈值参数(比如把127调整为100或150),让亮部更白、暗部更黑
  • 颜色类型选择:k1Gray是1位深度的灰度类型,最适合打印场景,文件体积小且打印清晰;如果需要保留更多过渡,也可以用kGray8(8位灰度)
  • 错误处理:实际使用时可增加文件存在性检查、加载失败处理等逻辑,避免程序异常

内容的提问来源于stack exchange,提问作者Martin Kakhuis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:32:48