¿Cómo se puede realizar transformaciones de color con perfiles ICC en un conjunto de valores de píxeles arbitrarias (no en una estructura de datos de imagen)?

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

Pregunta

Me gustaría convertir un conjunto de valores de píxel de un espacio de color de perfil a otro, sin que estos valores que residen en un archivo de imagen, tales como (por ejemplo) una lista de RGB / RGBA / CMYK / estructuras de datos, etc.

PIL a mi disposición, pero estoy interesado en soluciones en ambientes relacionados si eso es lo que se necesita.

La última PIL tiene muy buen soporte para LittleCMS - pero no hay manera de entregar ella que no sea nada una imagen PIL (o un objeto pyCMS heredados) para que actúe sobre.

Por lo que yo puedo determinar, el icctrans herramienta de línea de comandos que se incluye con LittleCMS hace algo de este tipo, pero me parece que no puede encontrar ninguna documentación no esquelético en él, y la documentación se refiere a ella como una demostración de la herramienta.

¿Fue útil?

Solución

Con el fin de utilizar la versión actual 2.3 del Poco CMS con Python, traduje lcms2.h a lcms2consts.py con el guión h2py.py que viene en la distribución de Python. La secuencia de comandos no se traduce declaraciones struct, pero las constantes son suficientes para hacer transformaciones de colores básicos con ctypes y lcms2 como una biblioteca dinámica.

En este ejemplo se transforma un solo color de laboratorio de doble precisión de 8 bits utilizando perfiles sRGB incorporado. Uso cmsOpenProfileFromFile(filename, 'r') en lugar de archivos.

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)

Otros consejos

Hay dos maneras.

  • La forma Hack: Para cambiar el perfil de estructuras de color N (y / o transformarlos entre espacios de color) se crea un 1x (N + 2) imagen con PIL.Image.new(), el uso yourimage.load() para conseguir un píxel -setting cosa interfaz de objetos y valores seleccionados de (0,0) a (0, n) a lo que usted tiene. Conjunto (0, N + 1) a blanco y (0, N + 2) hasta el negro, y transformar (o prueba transformada) que la imagen utilizando sus archivos ICC favoritos y PIL.ImageCms.ImageCmsTransform(). Blammo: ese objeto PIL es ahora su LUT. Leer los valores de la manivela de image.load() y ya está bueno.

  • El camino verdadero-nerd: Es necesario utilizar Python-colormath - que es ideal para las transformaciones colorspace pero no perfilado. Colormath no puede leer los perfiles ICC, por lo que a) se obtiene para analizar su formato binario loco de una manera fiable, o b) acaba de hacer los cálculos , literalmente. Este tío Bruce Lindbloom tiene todos los datos disponibles en formato Excel para, como, todos las matrices de que necesita para cambiar el perfil de sus tablas de búsqueda. Él es totalmente impresionante. Todavía estoy tratando de 'sólo' alimentar estos datos en colormath, así que sí, que me hace menos impresionante, ya que todavía estoy tratando de conseguir este 'camino empollón' en algo parecido a la producción de calidad.

Hay que ir. Eso es lo que he hecho hasta ahora para responder a la cuestión de la independiente, transforma LUT CPI tipo comando. U chicos, srsly.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top