CMYK und RGB Bilder unterscheiden sich insofern, als dass CMYK Bilder 4 Kanäle haben, RGB lediglich 3. Daraus folgt, dass CMYK Bilder grundsätzlich eine bessere Qualität haben, dadurch jedoch auch grösser sind. (Siehe die Kommentare dazu…) CMYK Bilder werden vor allem im Printbereicht verwendet. Im Web leben RGB Bilder. Daher kann es sehr wohl mal vorkommen, dass man ein CMYK Bild in ein RGB Bild umwandeln muss.
Image API
In der Image API gibt es eine Qualitätsoption. Diese ist per Default auf 75 gestellt. Die Bilder werden jedoch nicht automatisch verkleiner. Nehmen wir also an, es gibt noch ein Imagefield in unserem Nodetypen. Dort lässt sich eine maximale Grösse des Bildes definieren. Sobald das hochzuladende Bild grösser ist, wird es über die Image API entsprechend verkleinert. -> CMYK Bilder werden dann ganz automatisch in RGB Bilder umgewandelt. Es bleiben jedoch zwei Probleme übrig:
- Was passiert mit Bildern, die kleiner sind als die maximale Grösse und daher nicht verkleinert werden müssen?
- Was passiert mit den Farben?
Problem 1
Dieses Problem lässt sich so nicht lösen. Es gibt sonst keine Möglichkeit, das Bild gleich gross zu belassen und nur die CMYK zu RGB Umwandlung durchzuführen. -> No Go. Wenn nicht das Original Bild benutzt wird, kann mittels ImageCache ein Workaround durchgeführt werden. Mit dem Einsatz von ImageCache wird das Bild automatisch in ein RGB Bild umgewandelt.
Problem 2
Die Farben werden verfälscht. Wenn keine zusätzlichen Parameter angegeben werden und das Bild von CMYK in RGB umgewandelt wird, dann werden die Farben verfälscht. Das kommt daher, dass in CMYK 4 Kanäle vorhanden sind, in RGB lediglich 3. Die neuen Bilder sehen dann so ein wenig Neonfarbig aus, bzw. so als hätten sie ein wenig mehr Kontrast. Kann unter Umständen schöner sein, aber auf jeden Fall ist es eine Abweichung vom Originalbild.
Lösung – Rules
Die Lösung ist eigentlich gar nicht so schwierig und lässt sich mit einer Zeile PHP Code durchführen! Zuerst muss das Rules Modul installiert werden. Mittels Rules lassen sich Workflows abbilden. Es handelt sich bei Rules nicht um das Standard Rules aus Drupal Core!!! Ein kleinese Tutorial zu Rules vielleicht zu einem späteren Zeitpunkt.
Dort wird jetzt eine neue Regel angelegt, welche beim erstellen eines Nodes ausgeführt wird. Als Filter kann man noch den Nodetyp angeben, welcher das Imagefield beinhaltet. Als Action gibt man Custom PHP Code an. Mittels PHP kann man jetzt auf das Kommandozeilen Programm ImageMagick zugreifen (sofern der Hoster das erlaubt)
<!–?php
$path = $node->field_image[0]['filepath'];
$cmyk = "/path/to/lib/adobe_icc/USWebCoatedSWOP.icc";
$rgb = "/path/to/lib/adobe_icc/AdobeRGB1998.icc";
exec("convert -profile $cmyk -profile $rgb $path $path");
?>
Diese .icc Files können von Adobe heruntergeladen werden und müssen auf dem Server hinterlegt werden (oder sie sind bereits irgendwo auf dem Server vorhanden). Zusätzlich können natürlich auch noch weitere Angaben für ImageMagick mitgegeben werden:
<!–?php
exec("convert -profile $cmyk -profile $rgb -quality 75 -scale 3000×3000 $path $path");
?>
Dadurch, dass $path zwei mal gleich ist, wird das Original Bild überschrieben, wass wir ja auch wollen. Die beiden Parameter -quality und -scale reduzieren die Qualität auf 75 resp. skalieren das Bild auf maximal 3000×3000 Pixel. Das mit diesen Profilen hat mich einige Stunden gekostet 🙁 … dafür weiss ich es jetzt bis an mein Lebensende!