Signatur
Beschreibung
ImagickDraw ist eine PHP-Erweiterungsklasse der Imagick-Bibliothek und stellt eine vollständige Abstraktionsschicht für 2D-Vektorzeichnungen bereit. Mit ihr lassen sich Linien, Rechtecke, Ellipsen, Bezier-Kurven, Polygone und Textelemente auf einem Imagick-Canvas zeichnen, ohne direkt auf die ImageMagick-C-API zugreifen zu müssen.
Die Klasse folgt einem Zustandsmodell: Stift- und Füllfarben, Strichbreiten, Schriftarten, Transformationen und andere Eigenschaften werden zuerst am ImagickDraw-Objekt gesetzt, bevor Zeichenbefehle aufgerufen werden. Anschließend wird das fertige ImagickDraw-Objekt über Imagick::drawImage() auf das eigentliche Bild angewendet.
Typische Anwendungsfälle sind das dynamische Erzeugen von Grafiken mit Beschriftungen, das Erstellen von Diagrammen, das Wasserzeichen-Einfügen und allgemein das serverseitige Generieren von Bildinhalten. Der Zustand lässt sich über push()/pop() (bzw. pushGraphicContext()/popGraphicContext()) verschachteln, was komplexe Szenen erheblich vereinfacht.
Voraussetzung ist die installierte PHP-Erweiterung imagick (PECL) sowie eine kompatible ImageMagick-Bibliothek auf dem Server. ImagickDraw-Objekte selbst produzieren keine Ausgabe – sie müssen stets mit einem Imagick-Objekt kombiniert werden.
Beispiele
Rechteck und Text auf ein Bild zeichnen
<?php
// Neues weißes Canvas anlegen
$image = new Imagick();
$image->newImage(400, 200, new ImagickPixel('white'));
$image->setImageFormat('png');
// ImagickDraw-Objekt konfigurieren
$draw = new ImagickDraw();
// Gefülltes blaues Rechteck
$draw->setFillColor(new ImagickPixel('royalblue'));
$draw->setStrokeColor(new ImagickPixel('navy'));
$draw->setStrokeWidth(2);
$draw->rectangle(20, 20, 380, 100);
// Text darüber legen
$draw->setFillColor(new ImagickPixel('white'));
$draw->setFont('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf');
$draw->setFontSize(28);
$draw->setTextAlignment(Imagick::ALIGN_CENTER);
$draw->annotation(200, 70, 'Hallo ImagickDraw!');
// Zeichnung auf das Bild anwenden
$image->drawImage($draw);
// PNG ausgeben
header('Content-Type: image/png');
echo $image->getImageBlob();
$draw->destroy();
$image->destroy();
Gefüllter Kreis und Bezier-Kurve
<?php
$image = new Imagick();
$image->newImage(500, 300, new ImagickPixel('#f5f5f5'));
$image->setImageFormat('png');
$draw = new ImagickDraw();
// Gefüllter roter Kreis
$draw->setFillColor(new ImagickPixel('tomato'));
$draw->setStrokeColor(new ImagickPixel('darkred'));
$draw->setStrokeWidth(3);
$draw->circle(100, 150, 170, 150); // Mittelpunkt (100,150), Rand bei x=170
// Bezier-Kurve in Grün
$draw->setFillColor(new ImagickPixel('none'));
$draw->setStrokeColor(new ImagickPixel('green'));
$draw->setStrokeWidth(2);
$draw->bezier([
['x' => 220, 'y' => 250],
['x' => 320, 'y' => 50],
['x' => 380, 'y' => 280],
['x' => 480, 'y' => 80],
]);
$image->drawImage($draw);
header('Content-Type: image/png');
echo $image->getImageBlob();
$draw->destroy();
$image->destroy();
Grafik-Kontext verschachteln (push/pop)
<?php
$image = new Imagick();
$image->newImage(300, 150, new ImagickPixel('white'));
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeWidth(1);
$draw->setFillColor(new ImagickPixel('orange'));
// Ersten Kontext sichern
$draw->push();
$draw->setFillColor(new ImagickPixel('steelblue'));
$draw->rectangle(10, 10, 140, 140); // blaues Rechteck
$draw->pop(); // Stellt orangene Füllfarbe wieder her
$draw->rectangle(150, 10, 290, 140); // oranges Rechteck
$image->drawImage($draw);
header('Content-Type: image/png');
echo $image->getImageBlob();
$draw->destroy();
$image->destroy();
// Wichtig · Fallstricke
Wichtig: ImagickDraw ist ein eigenständiges Zustandsobjekt – Änderungen an Farben oder Schriftarten wirken auf alle nachfolgenden Zeichenoperationen, bis sie erneut geändert oder per pop() zurückgesetzt werden. Das versehentliche Vergessen eines pop() nach push() kann zu unerwartetem Zeichenverhalten führen.
Schriftdateien müssen mit einem absoluten Dateipfad oder einem gültigen ImageMagick-Fontnamen angegeben werden. Relative Pfade führen häufig zu Fehlern, besonders in Web-Server-Umgebungen.
Die Methode destroy() gibt den zugehörigen Speicher explizit frei; in lang laufenden Prozessen oder Schleifen empfiehlt sich deren Aufruf, um Speicherlecks zu vermeiden.
Nicht alle ImageMagick-Funktionen stehen je nach kompilierter Version der Bibliothek zur Verfügung. Fehlende Delegate-Bibliotheken (z. B. Freetype für Texte) können zu ImagickDrawException-Ausnahmen führen.