使用枕头

时间:2017-11-08 11:14:16

标签: python python-3.x jpeg tiff pillow

从tiff(CMYK)文件保存jpg缩略图时遇到以下问题:

  1. 使用从CMYK到RGB的颜色模式转换创建的缩略图获得蓝色色调:
  2. enter image description here

    1. 在photoshop中使用相同的tiff创建的缩略图(没有ICC配置文件,未转换为sRGB,仅限RGB)以正确的方式获取颜色:
    2. enter image description here

      1. 在没有色彩模式转换的情况下创建的缩略图(带有CMYK的jpeg)获得与photoshopped相似的结果,但不能用于网络(仍为蓝色)。
      2. 代码段:

        img = Image.open(img_tiff)
        img.thumbnail(size)
        img.convert("RGB").save(img_jpg, quality=70, optimize=True)
        

        此外,当试图包含tiff的ICC配置文件时,它会以某种方式损坏,并且photoshop抱怨配置文件已损坏。我使用以下命令将配置文件包含在保存功能中:

        icc_profile=img.info.get('icc_profile')  
        

        我在做错了什么/在这里失踪了?

        编辑:

        搜索解决方案我发现问题与icc配置文件有关。 TFF文件有FOGRA配置文件,jpeg应该有一些sRGB。无法从Pillow内部进行工作资料转换(ImageCms.profileToProfile()投掷PyCMSError cannot build transform'ImageCmsProfile' object is not subscriptable'PIL._imagingcms.CmsProfile' object is not subscriptable)。

        使用ImageMagick @ 7 convert找到问题的解决方法:

        com_proc = subprocess.call(['convert',
                                    img_tiff,
                                    '-flatten',
                                    '-profile', 'path/to/sRGB profile',
                                    '-colorspace', 'RGB',
                                    img_jpeg])
        

        转换结果非常好,文件大小非常小,最重要的是,颜色与原始tiff文件匹配。

        enter image description here

        仍然想知道如何在Pillow中正确地做到这一点(ICC简介阅读和申请)。

        Python 3.6.3,Pillow 4.3.0,OSX 10.13.1

2 个答案:

答案 0 :(得分:1)

CMYK到RGB获得蓝色色调的原因是因为转换仅使用非常粗略的公式,可能类似于:

  red = 1.0 – min (1.0, cyan + black)
green = 1.0 – min (1.0, magenta + black)
 blue = 1.0 – min (1.0, yellow + black)

要获得您期望的颜色,您需要使用适当的色彩管理系统(CMS),例如LittleCMS。显然Pillow能够使用LCMS,但我不确定它是否包含在默认值中,因此您可能需要自己构建Pillow。

答案 1 :(得分:1)

我终于找到了从Pillow(PIL)内部从CMYK转换为RGB的方法,而不会再次对ImageMagick进行外部调用。

#  first - extract the embedded profile:
tiff_embedded_icc_profile = ImageCms.ImageCmsProfile(io.BytesIO(tiff_img.info.get('icc_profile')))

#  second - get the path to desired profile (in my case sRGB)
srgb_profile_path = '/Library/Application Support/Adobe/Color/Profiles/Recommended/sRGB Color Space Profile.icm'

#  third - perform the conversion (must have LittleCMS installed)
converted_image = ImageCms.profileToProfile(
                                     tiff_img,
                                     inputProfile=tiff_embedded_icc_profile,
                                     outputProfile=srgb_profile_path,
                                     renderingIntent=0,
                                     outputMode='RGB'
                                    )
#  finally - save converted image:
converted_image.save(new_name + '.jpg', quality=95, optimize=True)

保留所有颜色。