По умолчанию PIL не зависит от цветовых пространств (например, sRGB и Adobe RGB).
Как вы, возможно, знаете, RGB - это просто три 8-битных значения для красного, зеленого и синего.CMYK - это четыре 8-битных значения.Когда вы используете Image.convert('RGB')
, он просто конвертирует каждый пиксель в тройное 8-битное значение.Таким образом, он в корне меняет режим способа представления и сохранения изображения.
sRGB и Adobe RGB, с другой стороны, это просто RGB цветовые пространства .По сути, это правила отображения этих трех значений на мониторе, принтере или любом другом физическом устройстве вывода.Такие правила могут быть добавлены в файлы JPEG в виде профилей ICC с помощью такого программного обеспечения, как, например, Photoshop.Но PIL обычно не присоединяет какой-либо профиль ICC, когда вы просто используете Image.save
.
Чтобы проверить, встраивает ли ваше изображение профиль ICC, вы можете найти ключ 'icc_profile'
в словаре image.info
следующим образом image.info.get('icc_profile', None)
.
Чтобы сохранить изображения JPEG с сохранением профиля ICC с помощью PIL, вы можете использовать что-то вроде этого:
img.save('image.jpg',
format = 'JPEG',
quality = 100,
icc_profile = img.info.get('icc_profile',''))
Чтобы преобразовать любое изображение JPEG RGB из его цветового пространства в 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):