Bild mit Wasserzeichen schützen mit PHP
Wenn man selbst erstellte Grafiken und Bilder im Internet veröffentlicht, möchte man diese unter Umständen schützen. Eine oft verwendete Methode ist es, dem entsprechenden Bild ein Wasserzeichen hinzuzufügen. Da dies manuell ein Haufen Arbeit ist, schauen wir uns heute an, wie man das Ganze mit PHP automatisieren kann.
Mit PHP kann man verschiedene Arten von Wasserzeichen realisieren, in diesem Tutorial wollen wir einem Bild, dynamisch einen Text hinzufügen. Dazu brauchen wir zunächst mal eine Fontdatei, mit der Schriftart in der das Wasserzeichen dargestellt ist und das Bild selbst. In diesem Tutorial gehen wir davon aus, dass das Bild im jpg – Format vorliegt.
Woher bekommt man eine Fontdatei?
Unter Windows findet man alle installierten Fonts unter windows/fonts, wenn man nun eine passende Schriftart gefunden hat, einfach copy&paste. Die Fontdatei muss dann natürlich auf den Server geladen werden. Wenn man auf eine beliebige andere Schriftart zurückgreifen will ist das auch kein Problem, einfach die zugehörige .ttf Datei auf den Server laden, auf dem das Script laufen soll.
PHP Wasserzeichen hinzufügen
Nun zur eigentlichen Funktion, PHP bietet eine ganze Menge Methoden zur Manipulation von Bilddateien. Auf der offiziellen Website von PHP findet man auch einige Beispiele und eine komplette Funktionsreferenz.
Hierbei sei noch angemerkt, dass diese Art der Bildverarbeitung einiges an Arbeitsspeicher und CPU verbraucht. Es sollte daher sichergestellt werden, dass der Server problemlos damit umgehen kann, sodass es zu keinen Aussetzern und Störungen kommt. Einzelne Bilder sind in der Regel kein Problem, wenn aber am Tag mehrere 1000 Bilder verarbeitet werden müssen, sollten man auch einen ausreichenden Server haben.
function watermarkImage ($SourceFile, $WaterMarkText, $DestinationFile='') {
list($width, $height) = getimagesize($SourceFile);
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($SourceFile);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width, $height);
$black = imagecolorallocate($image_p, 0, 0, 0);
$font = 'arial.ttf';
$font_size = 10;
imagettftext($image_p, $font_size, 0, 10, 20, $black, $font, $WaterMarkText);
if ($DestinationFile !== '') {
imagejpeg ($image_p, $DestinationFile, 100);
} else {
header('Content-Type: image/jpeg');
imagejpeg($image_p, null, 100);
};
imagedestroy($image);
imagedestroy($image_p);
};
Diese Funktion akzeptiert 3 Parameter, in $SourceFile wird der vollständige Pfad des Bildes angegeben, das mit einem Wasserzeichen versehen werden soll. Im Parameter $WaterMarkText steht der Text, mit dem das Bild gekennzeichnet werden soll, dies könnte z.B. ©example.com oder ähnliches sein.
Der letzte Parameter $DestinationFile enthält den Pfad auf dem Server, auf dem das neue, mit Wasserzeichen geschützte Bild, gespeichert werden soll. Wenn kein expliziter Pfad angegeben wird, wird das Wasserzeichen geschützte Bild einfach direkt ausgegeben und nicht gespeichert.
Die beiden letzten Zeilen der Funktion imagedestroy($image) und imagedestroy($image_p) erwecken den Eindruck, dass die Bilder gelöscht werden. Dem ist aber nicht so, weder das Ausgangsbild, noch das neu erstellt Bild wird dadurch zerstört. Es wird lediglich der Arbeitsspeicher, den die Bilder belegt haben, wieder freigegeben. Dies sollte man unbedingt machen, um keinen Überlauf zu riskieren.
$SourceFile = '/home/user/www/images/image1.jpg'; $DestinationFile = '/home/user/www/images/image1-watermark.jpg'; $WaterMarkText = '© example.com'; watermarkImage ($SourceFile, $WaterMarkText, $DestinationFile);
Wenn man nun noch die Position des Wasserzeichens ändern möchte, muss man dazu die Funktion ein wenig modifizieren. Dazu ändert man in der Zeile:
imagettftext($image_p, $font_size, 0, 10, 20, $black, $font, $WaterMarkText);
Die Werte 10 für X und 20 für Y. So kann man den Text beliebig auf dem Bild platzieren.
Hey,
könnte man diesen Script auch auf ein Bildverzeichnis erweitern, anstatt jedes Bild einzeln abzuarbeiten?
VG
Hi,
das ist problemlos möglich, es gibt hierzu auch bereits einen Artikel, wie man alle Bilder aus einem Verzeichnis auslesen kann.
Ebenso die Frage, kann man anstatt den Text von "$WaterMarkText = '© example.com';", auch ein anderes Bild, bspw. Logo nehmen, wenn ja wie?:)
Ja das geht, erfordert aber schon ein paar Änderungen, am besten googlest du einfach mal.