Convertir des JPG de AdobeRGB en sRGB en utilisant PIL?

Comment puis-je détecter si le JPG est AdobeRGB et s'il est converti en python en sRGB JPG.

si c'est possible en PIL, ce serait génial. Remercier.

10
demandé sur martineau 2012-06-15 00:42:24

3 réponses

Merci pour le spec lien martineau, j'ai mis quelques PIL code avec des fonctions qui détectent la présence D'un profil ICC Adobe RGB dans un Image, et convertissez l'espace coloré en sRGB.

adobe_to_xyz = (
    0.57667, 0.18556, 0.18823, 0,
    0.29734, 0.62736, 0.07529, 0,
    0.02703, 0.07069, 0.99134, 0,
) # http://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf                                

xyz_to_srgb = (
    3.2406, -1.5372, -0.4986, 0,
    -0.9689, 1.8758, 0.0415, 0,
    0.0557, -0.2040, 1.0570, 0,
) # http://en.wikipedia.org/wiki/SRGB                                                     

def adobe_to_srgb(image):
    return image.convert('RGB', adobe_to_xyz).convert('RGB', xyz_to_srgb)

def is_adobe_rgb(image):
    return 'Adobe RGB' in image.info.get('icc_profile', '')

# alternative solution if happy to retain profile dependency:                             
# http://stackoverflow.com/a/14537273/284164                                              
# icc_profile = image.info.get("icc_profile")                                             
# image.save(destination, "JPEG", icc_profile=icc_profile)

(j'ai utilisé ceux-ci pour créer un Djangofacile vignettes processeur de fonction):

def preserve_adobe_rgb(image, **kwargs):
    if is_adobe_rgb(image):
        return adobe_to_srgb(image)
    return image
7
répondu DrMeers 2013-09-04 10:52:04

j'ai eu le même problème, j'ai testé toutes les réponses et se tromper de couleur dans l'image finale. @DrMeers toutes les matrixes que j'ai essayé ont donné de mauvais résultats en rouge et les noirs, donc voici ma solution:

le seul moyen que j'ai trouvé est de lire le profil de l'image et convertir en utilisant ImageCms.

from PIL import Image
from PIL import ImageCms
import tempfile

def is_adobe_rgb(img):
    return 'Adobe RGB' in img.info.get('icc_profile', '')
def adobe_to_srgb(img):
    icc = tempfile.mkstemp(suffix='.icc')[1]
    with open(icc, 'w') as f:
        f.write(img.info.get('icc_profile'))
    srgb = ImageCms.createProfile('sRGB')
    img = ImageCms.profileToProfile(img, icc, srgb)
    return img

img = Image.open('testimage.jpg')
if is_adobe_rgb(img):
    img =  adobe_to_srgb(img)
# then do all u want with image. crop, rotate, save etc.

je pense que cette méthode peut être utilisée pour n'importe quel profil de couleur, mais pas testé.

7
répondu alekssaff 2017-01-07 17:10:12

pour programmer cela vous-même, vous pouvez convertir les pixels de l'espace coloré AdobeRGB en CIE XYZ, puis les convertir en sRGB. PIL image les objets ont une méthode nommée convert() avec la possibilité d'appliquer une matrice de transformation à tous les pixels dans une image (voir la section conversion dans la documentation en ligne du module D'Image PIL -- noter l'exemple montrant les valeurs matricielles nécessaires pour passer de RGB À XYZ).

dans la Section 4.3.4 L'AdobeRGB1998 .pdf spec montre une matrice pour transformer XYZ en RGB.

Je ne sais pas comment détecter l'espace de couleurs des images JPG. Je me souviens avoir lu quelque chose à propos des profils xml ICC attachés à la fin du fichier (et un problème qui se pose lorsqu'il y en a plus d'un), mais je ne peux pas en garantir la validité. L'article de Wikipedia sur le format de fichier JPEG dit les profils sont intégrés.

5
répondu martineau 2017-01-09 16:06:12