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.
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 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.
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.
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.
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:
/AbsoluteColorimetric | Farberhaltend (Perfektweiss) |
---|---|
/RelativeColorimetric | Farberhaltend (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.
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.
Eigene Umrechnungsmatrizen sind möglich für Graustufen und RGB, nicht aber für CMYK.
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.
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:
/WhitePoint | Array 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 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.
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:
/DefaultGray | Matrix oder Profil für Graustufen |
---|---|
/DefaultRGB | Matrix oder Profil für RGB |
/DefaultCMYK | Profil 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.
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
Diskussion