默认情况下,PIL 与颜色空间无关(如 sRGB 和 Adobe RGB)。
您可能知道,RGB 只是红色、绿色和蓝色的三个 8 位值。 CMYK 是四个 8 位值。当您使用Image.convert('RGB') 时,它只是将每个像素转换为三个 8 位值。因此,它从根本上改变了图像的表示和存储方式的模式。
另一方面,
sRGB 和 Adobe RGB 只是 RGB 颜色空间。基本上,这些是关于如何在显示器、打印机或任何其他物理输出设备上呈现这三个值的规则。例如,这些规则可以通过 Photoshop 等软件以 ICC 配置文件的形式添加到 JPEG 文件中。但是当您只使用Image.save 时,PIL 通常不会附加任何 ICC 配置文件。
为了检查您的图像是否嵌入 ICC 配置文件,您可以在字典 image.info 中查找密钥 'icc_profile',例如 image.info.get('icc_profile', None)。
为了使用 PIL 保存 JPEG 图像并保留 ICC 配置文件,您可以使用以下内容:
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):