Python实现JPG从sRGB转FOGRA39标准CMYK并匹配Photoshop效果的方案求助
Python实现JPG从sRGB转FOGRA39标准CMYK并匹配Photoshop效果的方案求助
我现在遇到个棘手的问题:想把sRGB格式的JPG图片转换成符合FOGRA39 ICC标准的CMYK格式,而且要达到和Photoshop几乎一致的转换效果。折腾了好一阵,目前有个勉强能用的方案,但不管是颜色还是文件体积,都还没达到理想状态。
一开始我尝试用wand库来处理,生成的文件体积倒是很小,但颜色完全跑偏了,根本没法用。后来换成PIL(Pillow)配合ImageCms来做色彩转换,结果终于靠谱了些——和Photoshop的输出已经非常接近,但还是有细微差别(比如天空的蓝色会偏暗一点),而且生成的文件比Photoshop导出的大不少。
下面是我目前在用的代码:
from PIL import Image, ImageCms import io import os icc_path = r'C:\Windows\System32\spool\drivers\color' input_image_path = 'C:\\tmp\\input.jpg' output_image_path = 'C:\\tmp\\output.jpg' srgb_profile_path = os.path.join(icc_path, "sRGB Color Space Profile.icm") cmyk_profile_path = os.path.join(icc_path, "CoatedFOGRA39.icc") with Image.open(input_image_path) as img: input_profile = ImageCms.ImageCmsProfile(srgb_profile_path) output_profile = ImageCms.ImageCmsProfile(cmyk_profile_path) converted_image = ImageCms.profileToProfile( img, inputProfile=input_profile, outputProfile=output_profile, renderingIntent=0, outputMode='CMYK' ) converted_image.save(output_image_path, quality=95, optimize=True)
我自己也发现了一个问题:现在代码里是直接默认原图用的是sRGB配置文件,但实际上应该先读取图片本身携带的色彩配置文件,再基于这个配置来做转换才对,不过我还没找到实现这个读取逻辑的方法。
有没有大佬能给点思路或者解决方案?优先考虑Python实现,但其他技术方案我也能接受,万分感谢!
对比图
- 原图(sRGB):

- Photoshop转换结果:

- PIL转换结果:

对比下来,CMYK转换结果的差别其实不大,最明显的就是PIL输出里的天空蓝色会比Photoshop的稍暗一些。
备注:内容来源于stack exchange,提问作者Erdorano




