You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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):Original sRGB
  • Photoshop转换结果:Photoshop Result
  • PIL转换结果:PIL Result

对比下来,CMYK转换结果的差别其实不大,最明显的就是PIL输出里的天空蓝色会比Photoshop的稍暗一些。

备注:内容来源于stack exchange,提问作者Erdorano

火山引擎 最新活动