Wie kann man Farbtransformationen mit ICC-Profilen auf einer Reihe von willkürlichen Pixelwerten (nicht auf einer Bilddatenstruktur) durchführt?

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

Frage

Ich möchte einen Satz von Pixelwerten von einem profilierten Farbraum in einen anderen konvertieren, ohne dass diese Werte in einer Bilddatei mit Wohnsitz, wie (beispielsweise) eine Liste von RGB / RGBA / CMYK / etc Datenstrukturen.

ich Python und PIL zu meiner Verfügung, aber ich bin in Lösungen interessiert in ähnlichen Umgebungen, wenn das ist, was es braucht.

Die neueste PIL hat sehr schöne Unterstützung für LittleCMS - aber keine Möglichkeit, es Hand etwas anderes als ein PIL Bild (oder ein Vermächtnis pyCMS Objekt) für sie auf handeln.

Soweit ich feststellen kann, das Kommandozeilen-Tool icctrans, die mit LittleCMS tut etwas dieser Art enthalten ist, aber ich kann scheinen nicht auf sie alle nicht-Skelett-Dokumentation zu finden, und die Dokumentation bezieht sich auf ihn als Demo-Tool.

War es hilfreich?

Lösung

Um die aktuelle Version 2.3 von verwenden Littlecms mit Python, ich übersetzte lcms2.h zu lcms2consts.py mit der h2py.py-Skript, das in der Python-Distribution kommt. Das Skript übersetzt nicht struct Erklärungen, aber die Konstanten sind genug, um grundlegende Farbtransformationen mit ctypes und lcms2 als dynamischer Bibliothek zu tun.

In diesem Beispiel wandelt eine einzelne Farbe aus doppelter Genauigkeit Lab auf 8-Bit sRGB integrierte Profile verwenden. Verwenden cmsOpenProfileFromFile(filename, 'r') stattdessen für Dateien.

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)

Andere Tipps

Es gibt zwei Möglichkeiten.

  • Die Hack Art und Weise: N Farbstrukturen profilieren (und / oder wandeln sie zwischen Farb) erstellen Sie ein 1x (N + 2) Bild mit PIL.Image.new(), Verwendung yourimage.load() ein Pixel zu erhalten -Einstellung Objekt Schnittstelle Sache, und Sollwerte (0,0) bis (0, N), was auch immer du hat. Set (0, N + 1) bis weiß und (0, N + 2) bis schwarz, und Transformation (oder Proof-Transformation) das Bild Ihres Liebling ICC-Dateien und PIL.ImageCms.ImageCmsTransform() verwenden. Blammo: dass PIL Objekt ist jetzt Ihre LUT. Lesen Sie die Werte aus dem image.load() Dingen und du ist gut.

  • Die wahren-Nerd Art und Weise: Sie verwenden müssen: tun nur die Mathematik , buchstäblich. Dieser Typ Bruce Lindbloom hat alle verfügbaren Daten im Excel-Format für, wie, alle die Matrizes Sie LUTs profilieren müssen. Er ist total genial. Ich versuche immer noch zu ‚nur‘ fütterte diese Daten in colormath, also ja, das macht mich weniger genial, da ich immer noch versuchen, diese ‚Nerd Art und Weise‘ zu bekommen in so etwas wie in Produktionsqualität.

Dort gehen Sie. Das ist, was ich bisher habe die Frage der freistehenden, Kommando-Stil ICC LUT Transformationen zu beantworten. U Jungs, srsly.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top