无法弄清楚为什么要在作物上更改文档配置文件,缩放并使用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图像.
更新:忽略这个答案,@ 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需要一些外部库,比如pyCMS或LittleCMS.我自己没有尝试过,但这是一个看起来很有前途的教程(使用后一种工具).最后,这是一个关于你所面临的同一问题的讨论主题(在加载/保存时保持颜色配置文件完好无损),希望它可以为你提供更多指针.