GD-Library oder Grafiken mit PHP (2/3)
Kategorie PHP & MySQL
Datum: 20.11.2007, 13:23 - Autor: Manko10
So, hier nun der 2. Teil des Tutorials.4. Formen
In diesem Teil geht es um die Erstellung geometrischer Formen mittels GD-Library. Zuerst erstellen wir auf unserem Bild aus Teil 1 ein rotes Rechteck, besser ein Quadrat. Dafür benötigen wir den Befehl imagerectangle(). Hiermit wird ein Rechteck in einer zuvor definierten Farbe erzeugt. Da ein Quadrat bekannterweise ein Rechteck ist, eignet sich dieser Befehl also hervorragend für unser Vorhaben. Also erstellen wir auf unserem Bild mit den folgenden Befehlen einen quadratischen Rahmen in roter Farbe:| PHP-Code: | ||
|---|---|---|
|
Die Funktion imagecolorallocate() ist bereits bekannt, imagerectangle() ist hingegen neu. Der erste Parameter gibt wieder die Bildfläche an. Der zweite und dritte geben die X- und Y-Koordinaten der oberen linken Ecke, der dritte und vierte die X- und Y-Koordinaten der unteren rechten Ecke an. Der letzte Parameter ist die Farb-Id. So, unser Rahmen ist jetzt fertig. Wenn du die Date speicherst und mit der HTML-Datei aufrufst, wirst du einen roten Rahmen um unsere bisheriges Bild sehen.
Nun wollen wir unserem Rahmen noch ein wenig 3D-Aussehen verpassen, weshalb wir noch Linien von den Bildecken zu den entsprechenden Rahmenecken ziehen. Dies lässt sich mit imageline() tun:
| PHP-Code: | ||
|---|---|---|
|
Die Paare zweiter und dritte sowie vierter und fünfter Parameter geben jeweils die X- und Y-Koordinaten der Endpunkte an. Somit ist jetzt ein 3-dimensional wirkender Rahmen entstanden, dem jetzt noch ein wenig Schatten fehlt. Zu diesem Zweck zeichnen wir an die entsprechenden Stellen ein gefülltes Polygon, also ein Vieleck beliebiger Form (weiter unten stelle ich noch eine geeignetere Methode vor, wir begnügen uns hier aber erstmal mit einem Polygon).
Die Funktion imagefilledpolygon() erwartet 4 Parameter. Zunächst die Bildfläche, dann ein Array aus den Koordinaten, die Anzahl der Punkte sowie die Farbe. Alles ein wenig verwirrend? Nun, so sieht es aus:
| PHP-Code: | ||
|---|---|---|
|
Hiermit werden zwei gefüllte Polygone erstellt. Im Array geben jeweils der erste und der zweite, der dritte und der vierte, der fünfte und der sechste ... Index einen Punkt an, die 4 bedeutet, dass das Polygon schließlich 4 Ecken haben soll.
Somit hat unser Bild nun einen 3-dimensionalen Rahmen.
Damit in dem Rahmen noch etwas mehr ist, als ein bloßes "Hallo Welt", zeichnen wir noch mit der Funktion imageellipse() eine gelbe Ellipse um den Text.
| PHP-Code: | ||
|---|---|---|
|
Ich glaube, auf die Erstellung der Farbe muss ich nun nicht mehr eingehen. Kümmern wir uns als um die zweite Funktion. Zunächst auch hier wieder die Angabe der X- und Y-Koordinaten wie bei den anderen Funktionen auch. Unterschied: Es wird nicht obere linke Ecke, die hier ja nicht existiert, sondern die Mitte angegeben. Der dritte und vierte Parameter bestimmen dann die Breite und Höhe der Ellipse.
So, dass wäre alle Funktionen zum Erstellen von geometrischen Formen. Es gibt jede Form in zwei Varianten: gefüllt und ungefüllt.
Ungefüllte Formen:
imagerectangle()
imageellipse()
imagepolygon()
[imageline()]
Gefüllte Formen:
imagefilledrectangle()
imagefilledellipse()
imagefilledpolygon()
imageline() habe ich mal in eckige Klammern gesetzt, da man es nicht direkt als Form bezeichnen kann. Außerdem existiert davon natürlich keine gefüllt Variante
.5. Farbe
Nun zu den Farben. An sich gibt es hier nicht viel zu schreiben. Den Befehl zum Referenzieren einer Farbe haben wir ja bereits kennengelernt. Es gibt jedoch noch eine Handvoll anderer Befehle, die ich jetzt einfach nur aufliste, da ihre Verwendung selbst klärend sein sollte.imagecolorallocate() - referenziert eine Farbe
imagecolorallocatealpha() - macht dasselbe, nur dass mit einem 5. Parameter noch eine Transparenzstufe von 0 (undurchsichtig) bis 127 (transparent) angegeben werden kann
imagecolordeallocate() - löscht eine referenzierte Farbe wieder
imagecolortransparent() - Macht eine zuvor definierte Farbe transparent (1. Parameter: Bildfläche, 2. Parameter: Farbe)
Das sind Befehle, um eine Farbe zu definieren. Jetzt stelle ich noch zum Schluss dieses Teils eine Methode vor, mit der man bestimmte Flächen ganz einfach mit einer auf diese Weise definierte Farbe füllen kann. Dazu benötigen wir die Funktion imagefill(). Diese Funktion erwartet 4 Parameter: Die Bildfläche, Die Anfangs-X-Koordinaten, die Anfangs-Y-Koordinate und die Farb-Id.
imagefill() füllt das Bild nun ab dem angegebenen Punkt mit einer Farbe. Dabei darf man sich das nicht so vorstellen, dass das ganze Bild an dem Punkt eine Kante hat und darunter alles farbig ist, nein. Die Funktion sucht an der angegeben Stelle nach Formen, die dort gemalt wurden und füllt sie aus. Sind dort keine Formen, so wird das ganze Bild ausgefüllt. Also ähnlich wie das Füllwerkzeug in einem Handelsüblichen Grafikprogramm.
Mit diesem Wissen können wir nun den 3-D-Effekt des Rahmens etwas besser gestalten. Entferne dazu zunächst einmal die Polygone sowie die Linie der oberen rechten Ecke aus dem Bild, wir brauchen sie jetzt nicht mehr. Dann definierst du eine Farbe $blue und gibst anschließend nach dem Zeichnen des Rahmens und der Linien folgende Anweisung ein:
| PHP-Code: | ||
|---|---|---|
|
Dies sucht an der angegeben Stelle nach einer Form und findet dort den Rand. Somit ist er nun eingefärbt ohne dass wir dafür weitere Formen brauchen.
Hier nochmal der komplette Quelltext, wie er jetzt aussehen sollte:
| PHP-Code: | ||
|---|---|---|
|
Und die Ausgabe:

Noch nicht sonderlich spektakulär, im nächsten Teil wird es aber spannender.
7 Kommentare:
Datum: 05.12.2008, 09:31 - Autor: Gast
Ein erster (sehr kleiner) Schritt sehr verständlich erklärt.Datum: 05.12.2008, 12:40 - Autor: Manko10
Hallo und schön, dass es dir gefällt.Wenn ich mal dazu komme, soll es auch noch weitere Teile geben, die etwas weiterführen, aber die sind derzeit leider noch nicht sin Sicht.
Datum: 06.01.2009, 14:32 - Autor: Gast
Das Script ist ja voll cool !Echt toll .
DANKE
mfg Chris
Datum: 09.03.2010, 11:00 - Autor: enOr
Sehr schöner Einstieg in die GD lib. Damit habe selbst ich es verstanden ;-)Habe ich was übersehen?
Datum: 06.04.2011, 15:28 - Autor: Thor Duisenberg
Erstmal danke für das Tutorial. Das war ein guter Anfang für mich, weil ich mich damit noch nie beschäftigt habe. So, jetzt zur Sache: Ich meine das Tut aufmerksam gelesen zu haben. Da nirgends erwähnt wird, wie das "test.png" zustande kommt und es auch gar nicht erstellt wird, möchte ich hier eine kleine Ergänzung machen: Schreibt den folgenden Befehl von oben um:Von: imagepng($img);
Zu: imagepng($img, 'test.png');
So habt ihr dann im Verzeichnis ein File namens: "test.png" und könnt es mit <img src="test.png"/> anzeigen lassen.
Datum: 06.04.2011, 15:54 - Autor: Manko10
Wenn du das Tutorial aufmerksam gelesen hast, wirst du feststellen, dass nicht auf test.png, sondern auf test.php verlinkt wird. In diesem Falle dient die PHP-Datei selbst also als Grafik; deshalb ja auch das anfängliche Setzen des Content-Types. Anstatt Text liefert die PHP-Datei in diesem Falle nämlich binäre Bildinformationen an den Browser. So ist gewährleistet, dass die Grafiken wirklich dynamisch generiert werden können. Sie auf dem Server zwischenzuspeichern könnte bei mehreren parallelen Zugriffen Probleme bereiten und sollte nur bedacht als Caching-Methode eingesetzt werden (jeweils mit eindeutigen Dateinamen).Datum: 06.04.2011, 15:57 - Autor: Manko10
Ergänzung: verwirrend war vielleicht, dass es hieß, dass die PHP-Datei unter dem Namen gd1.php gespeichert wird. Tatsächlich handelt es sich hierbei um einen kleinen Fehler. Die Datei wird natürlich unter dem Namen abgespeichert, mit dem sie eingebunden wird, hier also test.php.Ich habe das korrigiert.