PIL image.convert(“RGB”)是否将图像转换为sRGB或AdobeRGB?

2024-06-26 02:45:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用Python中的PIL将图像从各种模式(如RGBa、CMYK等)批量转换为sRGB。

但是,我不确定,也找不到它是否

image.convert("RGB") 

函数将图像转换为sRGB或Adobe RGB。我的直觉告诉我它会转化成sRGB。

如果它转换成sRGB,那么如果我传入Adobe RGB image来转换函数,它会成功地转换成sRGB吗?


Tags: 函数图像imageconvertpil模式rgb批量
1条回答
网友
1楼 · 发布于 2024-06-26 02:45:24

默认情况下,PIL对颜色空间(如sRGB和Adobe RGB)是不可知的。

如您所知,RGB只是红色、绿色和蓝色的三个8位值。CMYK是四个8位值。当您使用Image.convert('RGB')时,它只是将每个像素转换为三个8位值。因此它从根本上改变了图像的表示和存储方式。

另一方面,sRGB和Adobe RGB只是RGB颜色空间。基本上,这些是如何在监视器、打印机或任何其他物理输出设备上呈现这三个值的规则。例如,这些规则可以通过Photoshop等软件以ICC配置文件的形式添加到JPEG文件中。但是,当您只使用Image.save时,PIL通常不会附加任何ICC配置文件。

为了检查图像是否嵌入ICC配置文件,可以在字典中查找键'icc_profile',就像这样image.info

为了保存保存带有PIL的ICC配置文件的JPEG图像,您可以使用如下方法:

img.save('image.jpg',
         format = 'JPEG',
         quality = 100,
         icc_profile = img.info.get('icc_profile',''))

要将任何RGB JPEG图像从其颜色空间转换为sRGB,可以使用以下函数:

import io
from PIL import Image
from PIL import ImageCms

def convert_to_srgb(img):
    '''Convert PIL image to sRGB color space (if possible)'''
    icc = img.info.get('icc_profile', '')
    if icc:
        io_handle = io.BytesIO(icc)     # virtual file
        src_profile = ImageCms.ImageCmsProfile(io_handle)
        dst_profile = ImageCms.createProfile('sRGB')
        img = ImageCms.profileToProfile(img, src_profile, dst_profile)
    return img

因此,转换为单个RGB颜色空间的代码可能如下所示:

img = Image.open('image_AdobeRGB.jpg')
img_conv = convert_to_srgb(img)
if img.info.get('icc_profile', '') != img_conv.info.get('icc_profile', ''):
    # ICC profile was changed -> save converted file
    img_conv.save('image_sRGB.jpg',
                  format = 'JPEG',
                  quality = 100,
                  icc_profile = img_conv.info.get('icc_profile',''))

注意:您可能希望使用略低于100的质量。

输入示例(Adobe RGB JPEG):

Adobe RGB JPG

示例输出(sRGB JPEG):

sRGB JPG

相关问题 更多 >