Sab*_*bih 4 python rgb image python-imaging-library
我想使用Python中的PIL将图像从RGBa,CMYK等各种模式批量转换为sRGB。
但是,我不确定,无论在任何地方都找不到它,
image.convert("RGB")
Run Code Online (Sandbox Code Playgroud)
函数将图像转换为sRGB或Adobe RGB。我的直觉说,它可以转换为sRGB。
如果将其转换为sRGB,那么如果我传递Adobe RGB图像以进行转换功能,它将成功转换为sRGB吗?
默认情况下,PIL不了解颜色空间(例如sRGB和Adobe RGB)。
您可能知道,RGB只是红色,绿色和蓝色的三个8位值。CMYK是四个8位值。使用Image.convert('RGB')它时,只需将每个像素转换为三重8位值。因此,它从根本上改变了模式的图像是如何表示和存储。
另一方面,sRGB和Adobe RGB只是RGB颜色空间。基本上,这些是有关如何在监视器,打印机或任何其他物理输出设备上呈现这三个值的规则。例如,可以通过诸如Photoshop之类的软件以ICC配置文件的形式将此类规则添加到JPEG文件中。但是,当您仅使用PIL时,通常不会附加任何ICC配置文件Image.save。
为了检查您的图像是否嵌入了ICC配置文件,您可以像这样'icc_profile'在字典中查找密钥。 image.infoimage.info.get('icc_profile', None)
为了使用PIL保存保留ICC配置文件的JPEG图像,您可以使用以下方法:
img.save('image.jpg',
format = 'JPEG',
quality = 100,
icc_profile = img.info.get('icc_profile',''))
Run Code Online (Sandbox Code Playgroud)
为了将任何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
Run Code Online (Sandbox Code Playgroud)
因此,用于转换为单一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',''))
Run Code Online (Sandbox Code Playgroud)
注意:您可能要使用略低于100的质量。
输入示例(Adobe RGB JPEG):
输出示例(sRGB JPEG):