¿PIL image.convert (“RGB”) convierte las imágenes a sRGB o AdobeRGB?

Quiero convertir por lotes imágenes de varios modos, como RGBa, CMYK, etc. a sRGB usando PIL en Python.

Sin embargo, no estoy seguro y no puedo encontrarlo en ninguna parte si,

image.convert("RGB") 

La función convierte las imágenes a sRGB o Adobe RGB. Mi intuición dice que se convierte a sRGB.

Si se convierte a sRGB, entonces, si paso la imagen Adobe RGB para convertir la función, ¿se convertirá con éxito a sRGB?

Por defecto, PIL no es consciente de los espacios de color (como sRGB y Adobe RGB).

Como sabrá, RGB es simplemente tres valores de 8 bits para rojo, verde y azul. CMYK es cuatro valores de 8 bits. Cuando usas Image.convert('RGB') simplemente convierte cada píxel al valor de triple de 8 bits. Así que, fundamentalmente, cambia el modo en que se representa y almacena la imagen.

sRGB y Adobe RGB, por otro lado, son solo espacios de color RGB . Básicamente, estas son reglas sobre cómo representar esos tres valores en su monitor, impresora o cualquier otro dispositivo de salida físico. Tales reglas se pueden agregar a los archivos JPEG en forma de perfiles ICC mediante progtwigs como Photoshop, por ejemplo. Pero PIL normalmente no adjuntará ningún perfil ICC cuando solo use Image.save .

Para verificar si su imagen incorpora un perfil ICC, puede buscar la clave 'icc_profile' en el diccionario image.info como esta image.info.get('icc_profile', None) .

Para guardar imágenes JPEG que conserven el perfil ICC con PIL, puede usar algo como esto:

 img.save('image.jpg', format = 'JPEG', quality = 100, icc_profile = img.info.get('icc_profile','')) 

Para convertir cualquier imagen RGB JPEG de su espacio de color a sRGB, puede usar esta función:

 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 

Por lo tanto, su código para la conversión a un solo espacio de color RGB podría tener el siguiente aspecto:

 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','')) 

NOTA: es posible que desee utilizar una calidad ligeramente inferior a 100.

Ejemplo de entrada (Adobe RGB JPEG):

Adobe RGB JPG

Ejemplo de salida (sRGB JPEG):

sRGB JPG