Python PIL - 在裁剪,缩放和保存时将颜色配置文件更改为未标记的RGB

Chr*_*fer 15 python

无法弄清楚为什么要在作物上更改文档配置文件,缩放并使用PIL保存.已经使用sRGB作为颜色配置文件的图像进行了测试,并且在具有未标记的RGB之后进行了测试.

def scale(self, image):
    images = []

    image.seek(0)

    try:
        im = PIL.open(image)
    except IOError, e:
        logger.error(unicode(e), exc_info=True)

    images.append({"file": image, "url": self.url, "size": "original"})

    for size in IMAGE_WEB_SIZES:
        d = cStringIO.StringIO()
        try:
            im = crop(image, size["width"], size["height"])
            im.save(d, "JPEG")
            images.append({"file": d, "url": self.scale_url(size["name"]), "size": size})
        except IOError, e:
            logger.error(unicode(e), exc_info=True)
            pass

    return images
Run Code Online (Sandbox Code Playgroud)

我试图让PIL保存缩放版本与原始图像具有相同的颜色配置文件.

编辑:根据这个可能http://comments.gmane.org/gmane.comp.python.image/3215,但仍然无法使用PIL 1.1.7工作

Chr*_*fer 16

PIL具有读取icc_profile的功能,也是一种使用icc_profile进行保存的方法.所以我做的是打开文件来获取icc_profile:

try:
    im1 = PIL.open(image)
    icc_profile = im1.info.get("icc_profile")
Run Code Online (Sandbox Code Playgroud)

并在保存时再次将其添加到文件中:

im.save(d, "JPEG", icc_profile=icc_profile)
Run Code Online (Sandbox Code Playgroud)

和完整的代码:

def scale(self, image):
    images = []

    image.seek(0)

    try:
        im1 = PIL.open(image)
        icc_profile = im1.info.get("icc_profile")
    except IOError, e:
        logger.error(unicode(e), exc_info=True)

    images.append({"file": image, "url": self.url, "size": "original"})

    for size in IMAGE_WEB_SIZES:
        d = cStringIO.StringIO()
        try:
            im = crop(image, size["width"], size["height"])

            im.save(d, "JPEG", icc_profile=icc_profile)
            images.append({"file": d, "url": self.scale_url(size["name"]), "size": size})
        except IOError, e:
            logger.error(unicode(e), exc_info=True)
            pass

    return images
Run Code Online (Sandbox Code Playgroud)

我已经测试了标记(带有icc配置文件)和未标记的jpeg图像.


mgi*_*nbr 6

更新:忽略这个答案,@ Christoffer的答案是正确答案.事实证明,load没有进行任何转换,ICC配置文件只是被保存在其他地方.


我不认为这些操作中的任何一个都在改变颜色配置文件,但转换正在进行中load.在使用最新版本的PIL(Windows XP上的1.1.7)打开此示例图像后,它立即转换为RGB:

>>> from PIL import Image
>>> Image.open('Flower-sRGB.jpg')
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=600x450 at 0xD3D3F0>
Run Code Online (Sandbox Code Playgroud)

如果我试图将它保存回来(不改变任何东西),一些质量就会丢失.如果我使用无损格式OTOH,结果图像对我来说很好:

>>> im = Image.open('Flower-sRGB.jpg')
>>> im.save("Flower-RBG.jpg")
>>> im.save("Flower-RBG.png")
Run Code Online (Sandbox Code Playgroud)

尝试将生成的图像转换回sRGB不起作用:

>>> im = Image.open('Flower-sRGB.jpg').convert('CMYK')
>>> im
<PIL.Image.Image image mode=CMYK size=600x450 at 0xD73F08>
>>> im.save("Flower-CMYK.png")

>>> im = Image.open('Flower-sRGB.jpg').convert('sRGB')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 702, in convert
    im = im.convert(mode, dither)
ValueError: conversion from RGB to sRGB not supported
Run Code Online (Sandbox Code Playgroud)

我相信保存sRGB需要一些外部库,比如pyCMSLittleCMS.我自己没有尝试过,但这是一个看起来很有前途的教程(使用后一种工具).最后,这是一个关于你所面临的同一问题的讨论主题(在加载/保存时保持颜色配置文件完好无损),希望它可以为你提供更多指针.