如何借助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
相关产品推荐
相关产品推荐

