我想批量转换图像从各种模式,如RGBa,CMYK等,以sRGB使用PIL在Python。
但是,我不确定,也找不到它是否
image.convert("RGB")
将图像转换为sRGB或Adobe RGB。我的直觉告诉我它会转换成sRGB。
如果它转换为sRGB,并且我将Adobe RGB图像传递给convert
函数,它会成功转换为sRGB吗?
发布于 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图像,您可以使用类似以下内容:
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):
输出示例(sRGB JPEG):
https://stackoverflow.com/questions/50622180
复制相似问题