公司要打印一批展板,要求生成的图片是 CMYK 模式的图片。但是我用 Golang 搞了半天也无法生成跟设计稿颜色一致的图片, 对比发现生成都是 RGBA 模式的图片,颜色不对。最终使用 Python 的 Pillow 库轻松搞定。折腾了一下午,记录一下心路历程 。
什么是 CMYK 模式
主要用途: 印刷。专门为使用物理油墨在纸张等介质上复制颜色而设计。设计传单、海报、杂志、包装、画册等需要印刷的物料时,最终输出文件 必须是 CMYK 模式 。
- C: Cyan (青色)
- M: Magenta (品红色)
- Y: Yellow (黄色)
- K: Key (黑色 - Key 通常指印刷中的关键色版/定位版,也代表黑色以避免与 Blue 混淆)
而 RGBA 则用于显示屏。
Mac 系统自动工具
设计的同事用的是 Mac,有几百个 PDF 文件,需要转换成图片,然后再通过程序批量生成展板图片。
没想到用 Mac OS 系统自带的自动工具,可以轻松地实现 PDF 文件批量转 CMYK 的 JPG 图片。 准备用 golang 内置的图片库继续下一步的处理。
golang 不支持
发现 golang 的 image 虽然支持 NewCMYK,但是在 Encode 时,却不支持 CMYK 模式。
outputImg := image.NewCMYK(bgBounds)
从文档看 Decode 是支持 CMYK 模式的。
无奈找了半天也没有找到方案,我放弃了,决定试试 Python 的 PIL 库。
Python 的实现
首先需要安装 Pillow 库:
pip install pillow
然后,参考下面的使用方式读取 CMYK 图片,并保存。
from PIL import Image, ImageDraw, ImageFont
# 保留原始图片的ICC配置文件
bg_img = Image.open(background_path) # 原图是 CMYK 模式的图片
icc_profile = bg_img.info.get('icc_profile') # 获取ICC配置文件
# 各种处理,省略步骤 ...
# 保存时保留ICC配置文件
save_kwargs = {"format": "JPEG", "quality": 100}
if icc_profile:
save_kwargs["icc_profile"] = icc_profile
output_img.save(output_path, **save_kwargs)
为何要保留 ICC 配置文件
ICC 配置文件包含了颜色空间的信息,确保在不同设备上显示或打印时颜色的一致性。如果不保留ICC配置文件,可能会导致颜色失真或不准确。
一开始,我让 GPT 4.1 根据 golang 的实现重写了一版 Python 的处理程序,但是打开一个 cmyk 模式的图片,作为背景,不进行任何处理,保存之后,存储的图片颜色跟原始的背景颜色不同。下面图片有两组对比颜色,上面一组是使用 ICC 配置文件前生成的图片,下面一组是保留 ICC 配置文件后生成的图片。
让 Claude Sonnet 4 分析了一下,才找到问题:
- ICC 颜色配置文件丢失:CMYK 图片通常包含 ICC 配置文件来定义颜色空间,但PIL在处理时可能会丢失这些配置文件。
- 没有保留原始颜色配置文件:保存时没有指定 ICC 配置文件。
修改成上面的代码后,存储的图片颜色跟原始的背景颜色一致了。
ICC 配置文件存在于哪些格式的图片中
除了特定专业领域外,嵌入ICC通常只是可选操作。但为了色彩准确性,推荐在出版印刷等场景主动嵌入配置文件。
- 可靠嵌入支持: TIFF, JPEG, PSD, EPS, PDF, WebP, HEIF/HEIC, JPEG 2000, DNG (可选)。
- 规范支持但兼容性需注意: PNG。
- 通常不支持: GIF, BMP。
- RAW 文件: 专有 RAW 一般不直接嵌入 ICC,色彩意图由处理软件管理;DNG 支持嵌入。
关于作者 🌱
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式