Bildbearbeitung auf dem Server mit PHP
Pixel-Manipulierer
Grundlagen: Grafiken öffnen und speichern
Bildbearbeitung auf dem Server mit PHP
Mit der GD-Library lassen sich in PHP Bilder mit wenigen Handgriffen verändern. So können Sie Bilder direkt auf dem Webserver manipulieren und nach Ihren Wünschen verändern. Im Folgenden erfahren Sie, wie Sie die GD-Library nutzen und was es dabei zu beachten gilt. Die Beispiele bauen darauf auf, dass die zu bearbeitende Datei bereits geöffnet wurde. Neben den genannten Möglichkeiten lassen sich mit der GD-Library noch deutlich mehr Manipulationen an Bildern vornehmen. Der Workshop bietet Ihnen jedoch einen vor allem praktischen Einblick in die Arbeitsweise der Bibliothek.
Um eine existierende Grafik zu öffnen, wird die zum Grafiktyp passende Funktion verwendet. Für JPEG-Bilderbeispielsweise imageCreateFromJpeg. Folgende weitere Funktionen für bekannte Formate stehen zur Verfügung: imageCreateFromGif (GIF-Grafiken), imageCreateFromPNG (PNG-Grafiken) sowie imageCreateFromBMP (Bitmap-Grafiken). Der Dateiname der Grafik wird den Funktionen als Parameter übergeben. Alle Funktionen geben ein Handle auf die Grafik zurück, das für alle weiteren Operationen notwendig ist.
Nachdem die Bearbeitung abgeschlossen ist, sollten Sie die Grafiken erst einmal speichern. Dabei können Sie die Formate GIF, PNG und JPEG verwenden. imagePNG speichert die Grafik als PNG, imageJpeg als JPEG und imageGif als GIF. Diesen drei Funktionen müssen Sie zuerst das Grafik-Handle übergeben und wahlweise einen Dateinamen, ansonsten wird die Grafik direkt an den Browser ausgegeben. Bei imageJPEG können Sie als dritten Parameter auch noch die Kompressionsrate als Zahl angeben. Nach dem Speichern geben Sie das Grafik-Handle mit imageDestroy wieder frei.
Ein wichtiger Hinweis: Abgesehen von ein paar Ausnahmen erwarten alle Funktionen, dass als erster Parameter ein Grafik-Handle übergeben wird.
Thumbnails erstellen
Bildbearbeitung auf dem Server mit PHP
Zum Erstellen von Thumbnails steht in der GD-Library die Funktion imageCopyResized zur Verfügung. Wie der Name schon vermuten lässt, muss dazu eine neue leere Grafik erzeugt werden. Öffnen Sie zuerst die Quellgrafik, rufen Sie dann die Funktion imageCreateTrueColor auf und übergeben Sie ihr als Parameter die Größe der neuen Grafik in der Reihenfolge Breite ? Höhe. Falls Sie die Größe der Quellgrafik nicht kennen, können Sie mit imagesx und imagesy die Breite und Höhe in Pixel ermitteln.
Anschließend können Sie die Grafik kopieren, in die gewünschte Größe skalieren und in die Zielgrafik einfügen. In folgender Reihenfolge müssen die Parameter übergeben werden: Handle Zielgrafik, Handle Quellgrafik, Zielpunkt-X, Zielpunkt-Y, Quellpunkt-X, Quellpunkt-Y, Ziel-Breite, Ziel-Höhe, Quell-Breite, Quell-Höhe). Um die Quellgrafik mit der Größe 800 x 600 Pixel in ein 100 x 75 Pixel großes Thumbnail zu kopieren, lautet der Aufruf:
imageCopyResized($imgDst,$imgSrc,0,0,0,0,100,75,800,600);
Anschließend können Sie das Thumbnail mit folgendem Aufruf speichern:
imageJpeg($imgDst,'thumb.jpg',75);
Das vollständige Listing finden Sie auf der Heft-DVD in der Datei thumbnail.php.
In Graustufen umwandeln
Bildbearbeitung auf dem Server mit PHP
Das Konvertieren eines Bildes in Graustufen kann auf mehrere Arten erfolgen. Hier zunächst die einfachste Lösung:
Zunächst einmal muss die Quellgrafik geöffnet und deren Breite und Höhe bestimmt werden. Anschließend wird mit diesen Informationen eine neue Grafik erzeugt. Für die Konvertierung stellt die GD-Library leider keine passende Funktion zur Verfügung, immerhin aber eine Reihe von Hilfs-Tools, mit denen Sie die Farbanteile an einer bestimmten Position ermitteln können. In zwei ineinander verschachtelten for-Schleifen wird nun jedes Pixel der Quellgrafik einzeln überprüft.
for($x=0; $x<$srcW; $x++)
{
for($y=0; $y<$srcH; $y++)
{
Innerhalb der zweiten Schleife wird mit imageColorAt zunächst der Farbindex des Pixels ermittelt. Übergeben werden der Funktion zuerst das Grafik-Handle und anschließend die X- und Y-Koordinaten des Pixels. Diesen Farbindex übergeben Sie nun im nächsten Schritt als zweiten Parameter ? der erste ist das Grafik-Handle ? an die Funktion imageColorsForIndex. Die Funktion liefert dann ein assoziatives Array zurück, das die Anteile der einzelnen Farben Rot, Grün und Blau enthält. Diese können über die englischen Entsprechungen red, green und blue angesprochen werden, wie zum Beispiel $rgb[?red?]. Die Graustufe für die jeweilige Farbe errechnen Sie, indem Sie alle drei Farbanteile addieren, durch drei dividieren und auf eine ganze Zahl runden.
Führen Sie nun die Funktion imageColorAllocate aus und übergeben Sie ihr zuerst das Handle der Zielgrafik und anschließend dreimal die errechnete Graustufe. Die Funktion gibt dann den Farbindex der Graustufe in der Zielgrafik zurück.
Dem Pixel im Graustufenbild weisen Sie zum Schluss mittels imageSetPixel diesen Farbindex zu, beispielsweise
imageSetPixel($imgDst,$x,$y,$colorDst);
Nachdem die Schleifen komplett abgearbeitet wurden, befindet sich das Graustufen-Äquivalent der Quellgrafik nun in der Zielgrafik und kann abgespeichert werden. Das vollständige Listing finden Sie in der Datei greyscale.php auf der Heft-DVD.
Negativ erzeugen
Bildbearbeitung auf dem Server mit PHP
Das Erzeugen eines Negativabzugs eines Bildes erfolgt analog zu der Konvertierung in ein Graustufenbild, mit dem Unterschied, dass die Berechnung eine andere ist.
Ein Negativabzug ist im Endeffekt die Umkehrung der einzelnen Farben ? dies bedeutet aus Schwarz mit den Farbwerten 0,0,0 wird weiß mit den Farbwerten 255,255,255. Anstatt nun die einzelnen Farbanteile zu addieren und durch drei zu dividieren, wird jeder der Farbanteile einmal von 255 subtrahiert.
$rgbDst['red'] = 255 ? $rgbSrc['red'];
$rgbDst['green'] = 255 ? $rgbSrc['green'];
$rgbDst['blue'] = 255 ? $rgbSrc['blue'];
Mit dem Aufruf
imageColorAllocate($imgDst,$rgbDst['red'],$rgbDst['green'],$rgbDst['blue']);
wird der Farbindex dieser Farbe in der Zielgrafik ermittelt und anschließend mit imageSetPixel dem Pixel zugewiesen.
Beachten Sie dabei, dass ein mit dieser Methode erzeugtes Negativ nicht dem typischen Kleinbildnegativ entspricht, da hier andere Farbmischungen verwendet werden. Von daher wird diese Methode auch häufig Invertieren genannt ? um Verwechslungen zu vermeiden. Das vollständige Listing hierfür finden Sie auf der Heft-DVD in negativ.php.
Wasserzeichen einfügen
Bildbearbeitung auf dem Server mit PHP
Ein Wasserzeichen auf dem Papier ist meist erst dann zu sehen, wenn man dieses gegen das Licht hält. Bei Grafiken unterscheidet man jedoch zwischen zwei verschiedenen Typen von Wasserzeichen: sichtbare und unsichtbare. Unsichtbare Wasserzeichen werden so in das Bild integriert, dass die geringen Farbabweichungen für das menschliche Auge nicht wahrnehmbar sind, und erst durch die Eingabe eines Kennworts wird das Wasserzeichen sichtbar. Diese Technik wird dann eingesetzt, wenn das Bild selbst nicht wahrnehmbar verändert werden soll. Sichtbare Wasserzeichen sind häufig sanft in das Bild integrierte Logos oder Schriftzüge. Dies lässt sich sehr gut mit der GD-Library umsetzen, sofern wenn man hierbei ein paar Kleinigkeiten beachtet.
Die Grafik, die Sie als Wasserzeichen verwenden möchten, müssen sie als PNG-Grafik speichern und den Hintergrund der Grafik auf 100 Prozent Transparenz festlegen. Achten Sie bei Photoshop darauf, dass Sie ? auch wenn Sie einen transparenten Hintergrund beim Erstellen der Grafik festlegen ? trotzdem eine Ebene benötigen, die eine 100-prozentige Transparenz aufweist. Für die einzelnen Ebenen der Grafik legen Sie ebenfalls einen Transparenzgrad fest. Ein passender Wert hierfür wäre beispielsweise 50 Prozent.
Mit PHP fügen Sie nun lediglich die Quellgrafik mit dem Wasserzeichen zusammen. Öffnen Sie dazu die Quellgrafik und das Wasserzeichen und erzeugen Sie eine neue Grafik mit den gleichen Abmessungen wie die Quellgrafik. Mit imageCopy kopieren Sie dann das Originalbild in die neue Grafik mit den folgenden Parametern: Handle Quellgrafik, Handle Zielgrafik, Ziel-X, Ziel-Y, Quelle-X, Quelle-Y, Breite, Höhe. Bei dem folgenden Beispiel wird die gesamte Quellgrafik kopiert:
imageCopy($imgDst,$imgSrc,0,0,0,0,$srcW,$srcH);
Nun kopieren Sie außerdem noch das Wasserzeichen mit der Funktion imageCopy in die Zielgrafik an die gewünschte Position.
Das vollständige Listing für Wasserzeichen sowie eine Beispiel-Datei für Photoshop finden Sie auf der beiliegenden Heft-DVD in der Datei watermark.php.