Преобразует ли PIL image.convert ("RGB") изображения в sRGB или AdobeRGB? - PullRequest
0 голосов
/ 31 мая 2018

Я хочу выполнить пакетное преобразование изображений из различных режимов, таких как RGBa, CMYK и т. Д., В sRGB с использованием PIL в Python.

Однако я не уверен и не могу найти его где-либо,

*Функция 1004 *

преобразует изображения в sRGB или Adobe RGB.Моя интуиция говорит, что он преобразуется в sRGB.

Если он преобразуется в sRGB, то если я передам изображение Adobe RGB для преобразования функции, успешно ли оно преобразуется в sRGB?

1 Ответ

0 голосов
/ 31 мая 2018

По умолчанию 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):

Adobe RGB JPG

Пример вывода (sRGB JPEG):

sRGB JPG

...