Einführung in die gdLibrary (gdLib)

Wasserzeichen

Wer seine Fotos und Grafiken im Internet schützen möchte, wird ziemlich schnell feststellen, dass dies nahezu unmöglich ist. Ein Screenshot der Webseite auf der das Foto gezeigt wird reicht, und schon hat man eine saubere Kopie in 72 dpi.
Einzig ein Wasserzeichen kann den interessierten Dieb die Laune verderben. Am effektivsten ist hier nur ein visuelles Zeichen, zum Beispiel ein Logo, quer über das Bild. Das macht es für die weitere Verwendung ziemlich unbrauchbar. Wer klaut schon gern ein Foto und druckt das Copyright-Logo mit ab?

Die Fotos zu öffnen und das Logo mit Photoshop einzubinden — Stapelverarbeitung hin oder her — macht viel Arbeit. Aber wir kennen uns ja: Wir denken mit, und lassen die gdLib für uns arbeiten, die dies automatisiert erledigt.

Aufgabe: Wasserzeichen in ein bestehendes Bild einbinden (Bild in Bild)

Wir öffnen wie gewohnt unser Bild, im Beispiel narrtrium.jpg, erstellen uns ein neues Bild, mit dem wir arbeiten können.
Wir binden das Ursprungsbild mit imagecopyresampled() in das neue ein und zeichnen es ggf. noch weich. Nun laden wir uns das Wasserzeichenbild in den Speicher. Sinnigerweise benutzen wir ein PNG, damit wir ein freigestelltes Bild einsetzen können. Mit den Befehlen imagesx() und imagesy() lesen wir noch schnell die Breite und Höhe aus und definieren mit $watermarkdest_x und $watermarkdest_y die Position im neuen Bild.
Nun müssen wir unsere beiden Bilder nur noch zusammenfügen. Das macht der Befehlt imagecopymerge() für uns. Jetzt brauchen wir das daraus resultierende Bild nur noch ausgeben.

Der Code:

  1. <?php
  2.  
  3. header('Content-type: image/jpeg');
  4. $file = 'narrtrium.jpg';
  5.  
  6. // Originalformat auslesen
  7. $size = getimagesize($file);
  8. $width = $size[0];
  9. $height = $size[1];
  10.  
  11. // Bild laden
  12. $old_picture = imagecreatefromjpeg($file);
  13.  
  14. // Neues Bild erzeugen
  15. $new_picture = imagecreatetruecolor($width, $height);
  16.  
  17. // Kopiert das Ursprungsbild und formatiert es um + Weichzeichnung.
  18. imagecopyresampled($new_picture, $old_picture, 0, 0, 0, 0, $width, $height, $width, $height);
  19.  
  20. // Wasserzeichen einbinden
  21. $transition = 50;
  22. $watermarkfile = imagecreatefrompng('wasserzeichen.png');
  23. $waternarkpic_width = imagesx($watermarkfile);
  24. $waternarkpic_height = imagesy($watermarkfile);
  25. $watermarkdest_x = $width / 2 - ($waternarkpic_width / 2);
  26. $watermarkdest_y = $height / 2 - ($waternarkpic_height / 2);
  27. imagecopymerge($new_picture, $watermarkfile, $watermarkdest_x, $watermarkdest_y, 0, 0, $waternarkpic_width, $waternarkpic_height, $transition);
  28.  
  29. // Bild ausgeben
  30. imagejpeg($new_picture);
  31.  
  32. ?>
Bild in Bild: Das Logo verdeckt das das Foto und macht es damit für potentielle Diebe unbrauchbar.

Externe Bilder verarbeiten

Ich habe eine Anfrage erhalten, ob es auch möglich sei, externe Bilder als Basis zu verwenden. Sind die Rechte am Bildmaterial geklärt, gebt ihr einfach im o.g. Quellcode eine andere Quelle an:

  1. <?php
  2. $file = 'http://www.example.com/pics/beispiel.jpg';
  3. ?>
  4.  
Vorsicht, Bug in php!
In php Version 4.2.0 hat sich im Befehl imagecopymerge()ein Bug eingeschlichen, der die Transparenzfunktion außer Kraft setzt. Dieser Bug ist erst seit php Version 4.3.3RC3 behoben. Wenn es sich nicht anders vermeiden lässt, benutzt dann ersatzweise imagecopy(), der das gleiche tut, allerdings ohne Transparenzfunktion.
Die wichtigsten Befehle kurz im Überblick
  • imagesx
    imagesx(image)
    Ermittelt die Bild-Breite
  • imagesy
    imagesy(image)
    Ermittelt die Bild-Höhe
  • imagecopymerge
    imagecopymerge(dest_image, resource_image, dest_x, dest_y, src_x, src_y, src_w, src_h, percent transition)
    Fügt zwei Bilder zusammen
Downloads

Einführung in die gdLib | Version 2.0 alpha | 2005-10-07