首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PIL image.convert("RGB")是否将图像转换为sRGB或AdobeRGB?

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

Stack Overflow用户
提问于 2018-05-31 18:30:10
回答 1查看 19.6K关注 0票数 9

我想批量转换图像从各种模式,如RGBa,CMYK等,以sRGB使用PIL在Python。

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

代码语言:javascript
运行
复制
image.convert("RGB") 

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

如果它转换为sRGB,并且我将Adobe RGB图像传递给convert函数,它会成功转换为sRGB吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-31 19:59:53

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

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

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

为了检查你的图像是否嵌入了ICC profile,你可以在字典image.info中查找key 'icc_profile',就像这样的image.info.get('icc_profile', None)

为了使用PIL保存保留ICC配置文件的JPEG图像,您可以使用类似以下内容:

代码语言:javascript
运行
复制
img.save('image.jpg',
         format = 'JPEG',
         quality = 100,
         icc_profile = img.info.get('icc_profile',''))

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

代码语言:javascript
运行
复制
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颜色空间的代码可能如下所示:

代码语言:javascript
运行
复制
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):

输出示例(sRGB JPEG):

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50622180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档