如何检测JPG是否为AdobeRGB以及是否将其在python中转换为sRGB JPG。
如果在PIL中可行,那就太棒了。谢谢。
答案 0 :(得分:7)
感谢规范链接martineau,我已经将一些工作PIL
代码与检测Image
内Adobe RGB ICC配置文件存在的函数放在一起,并将颜色空间转换为sRGB。
adobe_to_xyz = (
0.57667, 0.18556, 0.18823, 0,
0.29734, 0.62736, 0.07529, 0,
0.02703, 0.07069, 0.99134, 0,
) # http://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf
xyz_to_srgb = (
3.2406, -1.5372, -0.4986, 0,
-0.9689, 1.8758, 0.0415, 0,
0.0557, -0.2040, 1.0570, 0,
) # http://en.wikipedia.org/wiki/SRGB
def adobe_to_srgb(image):
return image.convert('RGB', adobe_to_xyz).convert('RGB', xyz_to_srgb)
def is_adobe_rgb(image):
return 'Adobe RGB' in image.info.get('icc_profile', '')
# alternative solution if happy to retain profile dependency:
# http://stackoverflow.com/a/14537273/284164
# icc_profile = image.info.get("icc_profile")
# image.save(destination, "JPEG", icc_profile=icc_profile)
(我用这些来创建Django easy-thumbnails处理器函数):
def preserve_adobe_rgb(image, **kwargs):
if is_adobe_rgb(image):
return adobe_to_srgb(image)
return image
答案 1 :(得分:7)
我遇到了同样的问题,我在最终图像中测试了所有答案并得到了错误的颜色。 @DrMeers我试过的所有矩阵都给出了红色和黑色的错误结果,所以这是我的解决方案:
我发现的唯一方法是从图像中读取配置文件并使用ImageCms进行转换。
from PIL import Image
from PIL import ImageCms
import tempfile
def is_adobe_rgb(img):
return 'Adobe RGB' in img.info.get('icc_profile', '')
def adobe_to_srgb(img):
icc = tempfile.mkstemp(suffix='.icc')[1]
with open(icc, 'w') as f:
f.write(img.info.get('icc_profile'))
srgb = ImageCms.createProfile('sRGB')
img = ImageCms.profileToProfile(img, icc, srgb)
return img
img = Image.open('testimage.jpg')
if is_adobe_rgb(img):
img = adobe_to_srgb(img)
# then do all u want with image. crop, rotate, save etc.
我认为这种方法可用于任何颜色配置文件,但未经过测试。
答案 2 :(得分:5)
要自己编程,可以将AdobeRGB色彩空间中的像素转换为CIE XYZ,然后将其转换为sRGB。 PIL image
对象有一个名为convert()
的方法,可以将一般矩阵变换应用于图像中的所有像素(请参阅PIL在线文档中的convert部分)图像模块 - 请注意显示从RGB到XYZ所需的矩阵值的示例。
AdobeRGB1998 .pdf spec中的第4.3.4节显示了将XYZ转换为RGB的矩阵。
我不确定如何检测JPG图像的色彩空间。我记得读过一些关于ICC xml配置文件被附加到文件末尾的内容(以及出现多个时出现的问题),但我无法保证其有效性。关于JPEG file format的维基百科文章说明了个人资料。