5

Ich würde gerne eine Reihe von Pixelwerten von einem profilierten Farbraum in einen anderen konvertieren, ohne dass diese Werte in einer Bilddatei liegen, wie zB eine Liste von RGB/RGBA/CMYK/etc Datenstrukturen.Wie kann man Farbtransformationen mit ICC-Profilen auf einer Reihe von beliebigen Pixelwerten durchführen (nicht auf einer Bilddatenstruktur)?

Ich habe Python und PIL zu meiner Verfügung, aber ich interessiere mich für Lösungen in verwandten Umgebungen, wenn das ist, was es braucht.

Die neueste PIL hat sehr gute Unterstützung für LittleCMS - aber keine Möglichkeit, etwas anderes als ein PIL-Bild (oder ein Legacy-pyCMS-Objekt) für sie zu handeln. Wenn ich feststellen kann, dass das Befehlszeilentool icctrans, das in LittleCMS enthalten ist, etwas von dieser Art tut, kann ich keine nicht-skelettartige Dokumentation darüber finden, und die Dokumentation bezieht sich darauf ein Demonstrationswerkzeug.

Antwort

6

Um die aktuelle Version 2.3 von Little CMS mit Python zu verwenden, übersetzte ich lcms2.h-lcms2consts.py mit dem h2py.py-Skript, das in der Python-Distribution kommt. Das Skript übersetzt keine struct-Deklarationen, aber die Konstanten reichen aus, um grundlegende Farbtransformationen mit ctypes und lcms2 als dynamische Bibliothek durchzuführen.

In diesem Beispiel wird eine einzelne Farbe aus Double-Precision Lab in 8-Bit-sRGB mithilfe von integrierten Profilen umgewandelt. Verwenden Sie stattdessen cmsOpenProfileFromFile(filename, 'r') 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) 
+0

Ich habe die Frage vergessen! Das ist ein fantastisches Beispiel, ich fand es ziemlich nützlich (ich habe es nach Cython portiert, um plattformübergreifende Dynamic-Linking-Nits zu glätten), aber 'h2py' ist völlig der Rosetta-Stein der Python-Erweiterungsprogrammierung. Vielen Dank. – fish2000

+0

Dies könnte hilfreich sein: http://www.cazabon.com/pyCMS/ – jedierikb

5

Es gibt zwei Möglichkeiten.

  • Der Hack Weg: N Farbstrukturen (und/oder wandeln sie zwischen Farb) Sie erstellen 1x (N + 2) Bild mit PIL.Image.new(), verwenden yourimage.load() zu bekommen eine Pixel-Einstellung Objektschnittstelle zu profilieren und setze Werte (0,0) bis (0, N) auf alles, was du bekommen hast. Stellen Sie (0, N + 1) auf Weiß und (0, N + 2) auf Schwarz ein und transformieren (oder korrigieren Sie das Bild) mit Ihren bevorzugten ICC-Dateien und PIL.ImageCms.ImageCmsTransform(). Blammer: Das PIL-Objekt ist jetzt deine LUT. Lesen Sie die Werte mit dem image.load() Ding aus und Sie sind gut.

  • Die wahren-Nerd Art und Weise: Sie müssen Python-colormath verwenden - was für Farbraumtransformationen sind groß, aber nicht Profilierung. Colormath kann keine ICC-Profile lesen, also entweder a) Sie können ihr verrücktes Binärformat zuverlässig analysieren, oder b) just do the math, wörtlich. Dieser Typ Bruce Lindbloom hat alle Daten im Excel-Format für, wie, all of the matricies Sie müssen Ihre LUTs neu zu profilieren. Er ist total großartig. Ich versuche immer noch, diese Daten "nur" in Colormath zu füttern, also ja, das macht mich weniger genial, da ich immer noch versuche, diesen "Nerd-Weg" in etwas zu bekommen, das Produktionsqualität ähnelt.

Dort gehen Sie. Das ist es, was ich bisher getan habe, um die Frage nach freistehenden, kommandoartigen ICC-LUT-Transformationen zu beantworten. U Leute, srsly.

+0

jemals weiter mit Python-Colormath? – jedierikb

+0

@jedierikb Ich tat tatsächlich - während es nicht für allgemeine ICC-Profiltransformationen erlaubt, wenn Sie eine Möglichkeit haben, einige der grundlegenden Profilinformationen zu lesen, wird 'python-colormath' 90% der Mathematik abdecken.Es ist ein bisschen eine kontraintuitive Art zu gehen, als ob es sich anfühlt, als wäre man etwas Besonderes, bis man merkt, dass "allgemeine" ICC-Nutzung so ziemlich ein Spezialfall ist - am häufigsten beinhaltet Ihre Mathematik ein XYZ-Matrix-Transformation zu oder von sRGB-Werten und Verwendung einer LUT in den meisten anderen Fällen. Ich lese das Profil mit der ICCProfile-Klasse von http://dispcalgui.hoech.net – fish2000

Verwandte Themen