Farbkorrektur

Wahrscheinlich ist es jedem schon mal passiert, dass die Farben im Druck ganz anders aussahen, als auf dem Bildschirm. Etwas weniger häufig ist das Problem, dass die Farben auf dem eigenen, superteuren Spezialbildschirm anders aussehen, als auf dem Billigbildschirm von Rainer Juhser nebenan. Gerne wird in diesem Fall die schlechte Hardware verantwortlich gemacht, und oft liegt man damit auch richtig, aber es ist nur die halbe Wahrheit.

Wenn wir Farben im RGB-System angeben, dann ist zwar genau definiert, wie hoch die Rot- Grün- und Blauanteile sein sollen, aber nicht, welcher Rot- Grün- und Blauton dabei verwendet werden soll. Nicht alle Bildschirme verwenden dieselben Farbtöne. Beim Umrechnen in ein gänzlich anderes Farbsystem, wie CMYK für den Druck, mussten hier bislang ebenfalls Annahmen getroffen werden.

CIE Normfarben

Das Mass aller Dinge, wenn es um exakt definierte Farben geht, ist das CIE-Normvalenzsystem. Dieses ermöglicht unter anderem, eine Farbe exakt anhand von drei Werten X, Y und Z zu definieren. Arbeitet man mit diesen drei Werten, so ist vom XYZ-Farbraum (oder auch Tristimulus-Farbraum) die Rede.

Um sicherzustellen, dass unsere Farben auch richtig gedruckt werden, müssen wir angeben, wie unsere RGB-Farben in XYZ-Farben umgerechnet werden sollen. Die etwas besseren Drucker ihrerseits wissen, wie von den XYZ-Farben in ihre jeweiligen Druckerfarben umgerechnet werden muss. Bildschirme für Grafiker werden in der Regel ausgemessen, und die Ergebnisse dem Grafiktreiber mitgeteilt. Indem dieser von den originalen RGB-Werten nach XYZ umrechnet, und von diesen in die RGB-Werte des Monitors, kann die Anzeige so korrigiert werden, dass die Farben überall gleich aussehen.

sRGB

sRGB ist ein Farbraum, der auf dem RGB-Farbmodell basiert. Dabei sind die XYZ-Werte für Rot, Grün, Blau und Weiss fix definiert. Hierfür hat man sich am Phosphor in CRT Computermonitoren orientiert. Diese sind zwar inzwischen aus der Mode, aber auch moderne Flachbildschirme werden meist so justiert, dass die einzelnen Farben etwa sRGB entsprechen. Ausgenommen sind Bildschirme für Grafiker: Diese verwenden meist andere Farbtöne für die Grundfarben, die so gewählt sind, dass eine möglichst grosse Anzahl unterschiedlicher Farben erzeugt werden kann.

Gamma

Eine Problemquelle beim Umrechnen ist der Gammawert. Dieser dient als Exponent von den Helligkeitswerten zur tatsächlichen Helligkeit. Damit soll ausgeglichen werden, dass unser Helligkeitsempfinden nicht linear ist. Um von RGB auf XYZ zu kommen, müssen wir aber erst die tatsächlichen Helligkeiten berechnen. sRGB definiert eine Gammakurve, die aber leider nicht regelmässig ist. Eine Exponentialkurve mit Exponent 2,2 kommt der Kurve von sRGB aber recht nahe, weswegen ein Gammawert von 2,2 anwendbar ist.

ICC-Profile

Um der Materie Herr zu werden, haben namhafte Hersteller das International Color Consortium (ICC) gegründet, und dieses hat die ICC-Profile geschaffen. Es handelt sich dabei um Dateien, welche die Umrechnung von den jeweiligen Gerätefarben in XYZ-Farben unter Berücksichtigung des Gammawertes definieren. Zu diesem Zweck enthalten sie entweder Umrechnungsmatrizen oder Interpolationstabellen. Apple und Microsoft sprechen von ICM-Profilen (Image Color Management), aber es ist ein und dasselbe.

Umrechnungspriorität

Wenn zwischen Farbräumen umgerechnet werden muss, kommt man zuweilen um Kompromisse nicht herum. Insbesondere die Umrechnung von RGB für den Druck ist oft problematisch. Für solche Fälle können wir aber definieren, worauf Wert gelegt werden soll. Dies geschieht über den sogenannten Intent. PDF kennt folgende Varianten:

/AbsoluteColorimetricFarberhaltend (Perfektweiss)
/RelativeColorimetricFarberhaltend (Papierweiss)
/Saturation Sättigungserhaltend
/Perceptual Farbverhältniserhaltend

/AbsoluteColorimetric wird praktisch nur für Prüfdrucke im Profidruck verwendet. Beim Druck auf normales Papier wird diese Einstellung zu Farbfehlern führen, und ist daher nicht zu empfehlen.

/RelativeColorimetric ist allgemein ein sicherer Wert. Dabei werden die Farben möglichst wenig verändert.

/Saturation versucht, die Farben etwas herausstechen zu lassen. Das ist ein guter Wert für Business Grafik.

/Perceptual versucht, die Verhältnisse der Farben beizubehalten. Das ist ein guter Wert für Fotos.

Die meisten PDF Programme ignorieren diese Angabe für die Anzeige am Bildschirm, beachten sie aber beim Druck.

Umsetzung in PDF

PDF ermöglicht uns sowohl die Verwendung eigener Umrechnungsmatrizen, wie auch die Verwendung von ICC-Profilen. Ebenso haben wir eine einfache Möglichkeit, diese Einstellungen auf das ganze Dokument anzuwenden. Schliesslich gibt es eine Anweisung, welche den Intent festlegt.

In den meisten Fällen ist es sinnvoll, sRGB Umrechnungsmatrizen für Graustufen und RGB anzugeben, und auf den Einsatz von CMYK zu verzichten. Die Beispiele unten zeigen, wie die Matrizen für diesen Fall definiert werden müssen. Benutzt man allerdings einen Monitor, der nicht auf sRGB justiert ist, so sollte man für RGB statt dessen das ICC-Profil des Monitors verwenden. Nutzt man CMYK, so sollte man hierfür das ICC-Profil des Druckers verwenden.

Für eingebundene Bilder können Umrechnungsmatrix, ICC-Profil und Intent separat eingestellt werden. Siehe dazu das Unterkapitel.

Umrechnungsmatrizen

Eigene Umrechnungsmatrizen sind möglich für Graustufen und RGB, nicht aber für CMYK.

Graustufen

Die Matrix für Graustufen wird definiert durch ein Array mit zwei Einträgen. Der erste ist immer /CalGray, der zweite ein Dictionary. Dieses Dictionary muss folgende Einträge haben:

/WhitePoint Array der XYZ-Werte von Weiss
/Gamma Gammawert

Beispiel:

[/CalGray << /WhitePoint [0.9505 1 1.089] /Gamma 2.2 >>]

Dies entspricht dem Weisston „CIE D65“ bei einem Gamma von 2,2. Das sind die Daten für sRGB.

RGB

Die Matrix für RGB wird ebenfalls definiert durch ein Array mit zwei Einträgen. Der erste ist immer /CalRGB, der zweite ein Dictionary mit folgenden Einträgen:

/WhitePointArray der XYZ-Werte von Weiss
/Matrix Umrechnungsmatrix für RGB nach XYZ
/Gamma Array der Gammawerte

Die Umrechnungsmatrix ist eine 3×3 Matrix zur Umrechung eines horizontalen Vektors [R G B] auf einen Vektor [X Y Z]. Die Werte werden von links nach rechts, von oben nach unten angegeben.

Was die Gammawerte betrifft, so können sie für Rot, Grün und Blau separat angegeben werden. In der Praxis werden aber normalerweise keine unterschiedlichen Werte verwendet.

Beispiel:

[/CalRGB <<
/WhitePoint [0.9505 1 1.089]
/Matrix [0.4124 0.2126 0.0193
0.3576 0.7152 0.1192
0.1805 0.0722 0.9505]
/Gamma [2.2 2.2 2.2]
>>]

Dies entspricht wiederum den Werten von sRGB.

ICC-Profile

ICC-Profile können für RGB und CMYK hinterlegt werden. Profile für Graustufen können zwar grundsätzlich ebenfalls angegeben werden, sind in der Praxis aber selten (ein Profil für RGB kann nicht für Graustufen verwendet werden).

ICC-Profile müssen als Streamobjekte eingebunden werden, welche den Inhalt der Datei umfassen. Neben den üblichen Einträgen /Length und allenfalls /Filter muss noch ein Eintrag /N vorhanden sein. Der Wert muss 1, 3 oder 4 sein, je nachdem ob es sich um ein Profil für Graustufen, RGB oder CMYK handelt.

Zur Definition des Farbraums wird ein Array mit zwei Einträgen benötigt, wovon der Erste immer /ICCBased ist, und der zweite auf den Stream verweist.

Beispiel:

[/ICCBased 8 0 R]

Wir gehen hier davon aus, dass die Datei mit dem ICC-Profil in einem Stream mit Objektnummer 8 liegt.

Matrizen und Profile im Dokument

Um diese Tabellen und/oder ICC-Profile dokumentweit anzuwenden, müssen wir sie im Resourcendictionary unterbringen. Dazu wird ein zusätzlicher Eintrag /ColorSpace benötigt. Derselbe in dem auch die Pseudofarbräume für farblose Muster definiert werden. Der Wert ist ein Dictionary, und kann unter anderem folgende Einträge enthalten:

/DefaultGrayMatrix oder Profil für Graustufen
/DefaultRGB Matrix oder Profil für RGB
/DefaultCMYKProfil für CMYK

Die hier eingetragenen Matrizen oder Profile werden dann bei jeder Anwendung von g, G, rg, RG, k, K, /DeviceGray, /DeviceRGB oder /DeviceCMYK verwendet (ausser beim Alphakanal, dessen Werte ja nicht für die Helligkeit, sondern für den Deckungsgrad stehen).

Beispiel:

/Resources <<
/Fonts << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 7 0 R >>
/ColorSpace <<
/DefaultGray [/CalGray << /WhitePoint [0.9505 1 1.089] /Gamma 2.2 >>]
/DefaultRGB [/CalRGB <<
/WhitePoint [0.9505 1 1.089]
/Matrix [0.4124 0.2126 0.0193
0.3576 0.7152 0.1192
0.1805 0.0722 0.9505]
/Gamma [2.2 2.2 2.2]
>>]
>>
>>

Hier definieren wir sRGB für Graustufen und RGB.

/Resources <<
/Fonts << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 7 0 R >>
/ColorSpace <<
/DefaultGray [/CalGray << /WhitePoint [0.9505 1 1.089] /Gamma 2.2 >>]
/DefaultRGB [/ICCBased 8 0 R]
/DefaultCMYK [/ICCBased 9 0 R]
>>
>>

Hier definieren wir sRGB für Graustufen, verwenden ein ICC-Profil des Monitors im Objekt 8 für RGB, und ein ICC-Profil des Druckers im Objekt 9 für CMYK.

Intent im Dokument

Um den Intent festzulegen, können wir ganz einfach die ri Anweisung verwenden. Diese erwartet einen Parameter mit dem Namen des Intent (siehe oben).

Beispiel:

/RelativeColorimetric ri