Come si può eseguire le trasformazioni di colore con profili ICC su un insieme di valori dei pixel arbitrari (non su una struttura di dati di immagine)?

StackOverflow https://stackoverflow.com/questions/3597528

Domanda

Vorrei convertire un insieme di valori dei pixel da un colore in profilato ad un altro, senza questi valori che risiedono in un file di immagine, come (ad esempio) un elenco di RGB / RGBA / CMYK / strutture di dati, ecc.

Ho Python e PIL a mia disposizione, ma io sono interessato a soluzioni in ambienti affini, se questo è quello che ci vuole.

L'ultima PIL ha molto bello il supporto per LittleCMS - ma c'è modo di consegnatelo qualcosa di diverso un'immagine PIL (o un oggetto pyCMS legacy) per poter agire.

Per quanto posso constatare, lo strumento icctrans della riga di comando che è incluso con LittleCMS fa qualcosa del genere, ma io non riesco a trovare alcuna documentazione non-scheletrica su di esso, e la documentazione si riferisce ad esso come un dimostrazione strumento.

È stato utile?

Soluzione

Per poter utilizzare l'attuale versione 2.3 di Piccolo CMS con Python, ho tradotto lcms2.h al lcms2consts.py con la sceneggiatura h2py.py che arriva nella distribuzione Python. Lo script non si traduce dichiarazioni struct, ma le costanti sono sufficienti per fare trasformazioni di colore di base con ctypes e lcms2 come una libreria dinamica.

Questo esempio trasforma un singolo colore dal doppio Lab precisione a 8-bit sRGB utilizzando i profili incorporati. Utilizzare cmsOpenProfileFromFile(filename, 'r') invece per i file.

import ctypes
from ctypes import byref
from lcms2consts import *

lcms = ctypes.windll.lcms2

inprof = lcms.cmsCreateLab4Profile(0)
outprof = lcms.cmsCreate_sRGBProfile()
xform = lcms.cmsCreateTransform(inprof, TYPE_Lab_DBL, 
    outprof, TYPE_RGB_8,
    INTENT_PERCEPTUAL, 0)
lcms.cmsCloseProfile(inprof)
lcms.cmsCloseProfile(outprof)

DblTriplet = ctypes.c_double * 3
ByteTriplet = ctypes.c_ubyte * 3
inbuf = DblTriplet(60.1,20.2,0.5)
outbuf = ByteTriplet()
lcms.cmsDoTransform(xform, byref(inbuf), byref(outbuf), 1)
print list(outbuf)

lcms.cmsDeleteTransform(xform)

Altri suggerimenti

Ci sono due modi.

  • Il modo mod: Per reprofile strutture colore N (e / o di trasformarli tra spazi di colori) si crea un 1x (N + 2) Immagine con PIL.Image.new(), uso yourimage.load() per ottenere un pixel -setting oggetto cosa l'interfaccia, e valori impostati (0,0) a (0, N) per tutto quello che ha ottenuto. Set (0, N + 1) al bianco e (0, N + 2) al nero, e trasformare (o la prova-Transform) che l'immagine utilizzando i file ICC preferiti e PIL.ImageCms.ImageCmsTransform(). Blammo: quell'oggetto PIL è ora il tuo LUT. Leggere i valori fuori con il thingy image.load() e si sta bene.

  • Il modo vero secchione: è necessario utilizzare Python-colormath - che è grande per le trasformazioni spazio colore, ma non profiling. Colormath non può leggere i profili ICC, quindi o a) si arriva a analizzare il loro formato binario folle in modo affidabile, oppure b) basta fare due conti , letteralmente. Questo ragazzo Bruce Lindbloom dispone di tutti i dati disponibili in formato Excel per, come, tutti i da matrici è necessario reprofile tuoi LUT. Lui è semplicemente meraviglioso. Sto ancora cercando di 'solo' nutrire questi dati in colormath, quindi sì, questo mi rende meno impressionante come io sto ancora cercando di ottenere questo 'modo secchione' in una sorta di produzione di qualità.

Non ci si va. Questo è quello che ho fatto finora per rispondere alla domanda di freestanding, commando in stile trasforma ICC LUT. U guys, srsly.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top