PHPImageWorkshop: Serverseitige Bildbearbeitung leicht gemacht

PHPImageworkshop – Möglichkeiten
PHPImageworkshop ist ein Miniphotoshop für Webworker, die sich die aufwändige Entwicklung von Bildbeararbeitungsfunktionen ersparen wollen. Bilder einlesen, Größen verändern, Bilder drehen, Texte einfügen und vieles mehr ist mit der kompakten Klasse möglich. Ein besonderes Feature ist die Ebenen- und Gruppen-Funktion des Klasse. Wie bei Photoshop, Gimp und Co. können Bilder in Ebenen mit Transparenzen angeordnet und jederzeit bearbeitet werden. Mehrere Ebenen in einem Objekt ergeben eine Gruppe. Änderungen an einer Gruppe werden auf alle Ebenen in der Gruppe angewandt.
PHPImageworkshop – Anwendung
Jeder, der schon mal mit Bildverarbeitung in PHP zu tun hatte, dürfte wissen, dass es alles andere als simpel ist, Bilder in die Form zu bringen, in der man sie braucht. Es beginnt schon beim Einlesen: imagecreatefromgif(), imagecreatefrompng(), imagecreatefromjpeg(). Für jedes Format gibt es eine Funktion. PHPImageworkshop setzt schon hier an und erleichtert das Einlesen der Bilder:
$foto = new ImageWorkshop(array('imageFromPath' => '/images/bild.jpg'));
Mit nur einer Codezeile liest PHPImageworkshop das Bild ein und stellt über $foto wichtige Informationen zum geladenen Bild zur Verfügung.
/* Breite des Bildes */
$foto -> getWidth();
/* Höhe des Bildes */
$foto -> getHeight();
/* Kürzeste Seite des Bildes (in px) */
$foto -> getNarrowSideWidth();
/* Längste Seite des Bildes (in px) */
$foto -> getLargestSideWidth();
Mit diesen Werten können wir nun arbeiten, um zum Beispiel die Größe des Bildes zu verändern. Dafür bietet die Klasse die Funktionen resizeInPourcent($width,$height,$preserveRatio) und resizeInPixel($width,$height,$preserveRatio). Beide Funktionen erwarten die gewünschte Maximalbreite oder Maximalhöhe des Bildes und können die Bilder bei Bedarf proportional skalieren. Die nachfolgende Anweisung sorgt z.B. dafür, dass das geladene Bild auf eine Größe mit maximal 800px Breite skaliert wird.
$foto -> resizeInPixel(800,null,true);
Auch das Beschneiden von Bildern ist möglich.
$foto
->cropInPixel(
$newWidth
,
$newHeight
,
$positionX
,
$positionY
,
$position
);
Hierfür werden die Werte für die neue Breite ($newWidth) und Höhe ($newHeight), die X- und Y-Koordinaten des Punktes, von dem aus Geschnitten werden soll ($positionX, $positionY) und die Ausgangsposition der Achse ($position) benötigt.
Die Achse kann an verschiedenen Bereichen des Bildes angesetzt werden:
Folglich erzeugt der folgende Code ein 100x100px großes Bild von der linken unteren Ecke mit einem Offset von 30px in X- und 50px in Y-Richtung aus.
$foto->cropInPixel(100, 100, 30, 50, "LB")
;
Durch die Ebenenfunktionen sind sehr fexible Bildbearbeitungen und Kombinationen möglich. Mit der Methode addLayerOnTop() könnt ihr eine neue Ebene in euer Bild laden.
$foto -> addLayerOnTop($image,$positionX,$positionY,$position);
Die Methode erwartet das jeweillige Bild als ImageWorkshop Objekt, die Koordinaten an denen es eingefügt werden soll und die Ausgangsposition der Achse. Als Rückgabewert erhaltet ihr die Nummer und die ID der aktuell erzeugten Ebene. Mit diesen Informationen könnt ihr weitere Veränderungen an der Ebene durchführen. Der folgende Code greift zum Beispiel auf die zweite Ebene in der Gruppe $foto zu und dreht diese um 90°:
$foto -> layers[2] -> rotate(90);
Außerdem können Ebenen in Gruppen jederzeit Nach oben oder unten verschoben werden:
$foto->moveUp($sublayerId); // eine Ebene Höher
$foto->moveDown($sublayerId); // eine Ebene tiefer
$group->moveTop($sublayerId); // auf die oberste Ebene
$group->moveBottom($sublayerId); // auf die tiefste Ebene
PHPImageworkshop erlaubt neben der einzelnen Veränderung von Ebenen in den jeweiligen Gruppen und Untergruppen auch die Bearbeitung der gesamten Gruppe indem die jeweiligen Methoden auf die gesamte Gruppe statt auf die Ebenen angewandt werden.
Außerdem bietet die Klasse eine komfortable Möglichkeit, Text in Fotos einzufügen. Am besten definiert man dafür eine neue Ebene:
$text_ebene = new ImageWorkshop(
array(
"text" => "Hallo Welt!",
"fontPath" => "font.ttf",
"fontSize" => 50,
"fontColor" => "FFFFFF",
"backgroundColor" => "FF0000",
"textRotation" => 0
)
);
$foto->addLayerOnTop($text_ebene, 0, 0, 'LT');
Der Code erklärt sich fast von selbst: Es entsteht eine neue Bildebene mit einem Text, der mit der Schrift font.ttf in der Größe 50 mit Weiß auf rotem Hintergrund und ohne Rotation steht. Diese Ebene wird dann in der oberen linken Ecke des Bildes platziert. Um einen transparenten Hintergrund zu erhalten, kann für backgroundColor der Wert null übergeben werden.
Zu guter letzt möchte man das Bild natürlich auch ausgeben oder Speichern:
$foto->save($dirPath, $filename, $createFolders, $backgroundColor, $imageQuality);
Die Methode erwartet den Pfad zum Speicherziel ($dirPath), den Dateinamen ($filename), die Erlaubnis bzw. das Verbot Ordner anzulegen ($createFolders), die Hintergrundfarbe ($backgroundColor) und die Bildqualität ($imageQuality).
Versuchen wir aber jetzt die Theorie mit etwas Praxis zu verknüpfen. Die folgenden zwei Beispiele sollen die einfache und kompakte Funktionsweise des Scripts demonstrieren. Die Beispiele sind am Ende des Artikels als Download hinterlegt.
Praxisbeispiel: Watermark
Watermarking ist wohl eine der häufigsten Anwendungen für PHP-Bildverarbeitung. Setzen wir uns also nun zum Ziel eine Logo Grafik in die obere rechte Ecke eines Bildes zu setzen und es anschließend als jpg abzuspeichern.
Schritt 1: Logo und Foto laden
$foto = new ImageWorkshop(array('imageFromPath' => 'images/bild.jpg'));
$logo = new ImageWorkshop(array('imageFromPath' => 'images/logo.png'));
Schritt 2: Logo Größe anpassen
$logo-> resizeInPixel(400,null,true);
Schritt 3: Logo auf Bild platzieren
$foto->addLayerOnTop($logo, 50, 50, 'RT');
Schritt 4: Bildgröße ändern
$foto->resizeInPixel(640, null, true);
Schritt 5: Bild speichern
$foto->save("images", "crop.jpg", true, '#000', 95);
Praxisbeispiel: Thumbnail
Auch die Erzeugung von Thumbnails ist ein häufiger Anwendungsbereich für serverseitige Bildbearbeitung. Klar kann man Thumbnails mit Photoshop erstellen und manuell hochladen. Alles automatisch von PHP erledigen zu lassen ist aber auf Dauer um einiges angenehmer.
Schritt 1: Foto Laden
$foto = new ImageWorkshop(array('imageFromPath' => 'images/bild.jpg'));
Schritt 2: Foto Beschneiden
Mit cropMaximumInPixel() kann das Bild automatisch auf eine quadratische Form getrimmt werden. Dabei generiert die Funktion möglichst wenig Verschnitt. Es kann der Offset auf der X- und Y-Achse und die Ausgangsposition der Achse festgelegt werden.
$foto->cropMaximumInPixel(0, 0, "MM");
Schritt 3: Größe ändern
$foto->resizeInPixel(150, 150);
Schritt 4: Bild speichern
$foto->save("images", "crop.jpg", true, '#000', 95);
Bequemer Helfer für Webworker
PHPImageworkshop erleichtert die Arbeit mit Bildern enorm. Es ist leicht zu bedienen, bietet viele nützliche Funktionen und spart jede Menge Codezeilen. Auf der Projekteseite von PHPImageWorkshop findet ihr mehr Infos und Beispiele sowie den Download der aktuellen Version der Klasse.
Die Beispiele zum PHPImageWorkshop aus diesem Artikel könnt ihr hier herunterladen.
Über den Autor
Als selbstständiger Kommunikations- & Mediendesigner und Software Entwickler unterstützt Ilja Zaglov kleine und mittelständische Unternehmen bei der Erstellung von Online- und Offline Medien. Neben Web-Gestaltung gehören Motion-Graphics und 3D-Inhalte zu seinen Spezialgebieten.
Guter Artikel!
Leider funktioniert die Verlinkung nicht. Die Sub-Domain ‚www‘ wird auf dem Zielserver nicht in das richtige VHost Verzeichnis geroutet. Folgender Link funktioniert:
http://phpimageworkshop.com/
Gruß
Ändert nichts an der Tatsache das die gdlib Bilder in schlechter Qualität erzeugt. Ich greife weiterhin zu imagemagick..
Schöne Beispiele, suche schon etwas länger eine einfache Lösung für Wasserzeichen.
Danke!
Der Beitrag ist tatsächlich schon etwas älter, aber sehr schön geschrieben. Ich würde diese Klasse gerne einbinden, kriege es aber leider nicht hin. Hat hier jemand Erfahrungen? Ich bin Hobby-Programmierer. Danke!