使用 PIL 将 JPG 从 AdobeRGB 转换为 sRGB



如何检测JPG是否是AdobeRGB,以及它是否在python中将其转换为sRGB JPG。

如果在太平船务中可以做到这一点,那就太好了。谢谢。

我遇到了同样的问题,我测试了所有答案并在最终图像中获得了错误的颜色。 @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.

我认为这种方法可以用于任何颜色配置文件,但未经测试。

感谢您的规范链接 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简易缩略图处理器函数):

def preserve_adobe_rgb(image, **kwargs):
    if is_adobe_rgb(image):
        return adobe_to_srgb(image)
    return image

要自己编程,您可以将 AdobeRGB 色彩空间中的像素转换为 CIE XYZ,然后将其转换为 sRGB。PIL image对象具有一个名为 convert() 的方法,该方法能够对图像中的所有像素应用常规矩阵转换(请参阅 PIL Image 模块在线文档中有关Image.convert()的部分 - 请注意显示从 RGB 到 XYZ 所需的矩阵值的示例)。

AdobeRGB1998 .pdf规范中的第 4.3.4 节显示了将 XYZ 转换为 RGB 的矩阵。

我不确定如何检测JPG图像的色彩空间。我记得读过一些关于ICC xml配置文件附加到文件末尾的内容(以及当有多个配置文件时出现的问题),但我不能保证它的有效性。维基百科关于JPEG文件格式的文章说配置文件是嵌入的。

相关内容

  • 没有找到相关文章

最新更新