CMYK 印刷展板图片批量生成,Python 程序踩坑记

更新日期: 2025-08-18 阅读次数: 11 字数: 1057 分类: Python

公司要打印一批展板,要求生成的图片是 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 配置文件后生成的图片。

颜色对比 CMYK

让 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 聊聊, 查看更多联系方式