Lionstarrs Linux Blog

Ein Blog über Linux und die Welt

Dynamische Bildgenerierung mit PHP

Um mit PHP dynamisch Bilder zu generieren muss ersteinmal die GD-Library installiert sein. Ob dies so ist kann man einfach überprüfen, indem man eine PHP-Datei mit folgendem Inhalt erstellt:

phpinfo

  1. <?

  2. phpinfo();

  3. ?>

Diese Datei ruft man im Browser auf. Nun sucht man nach der Überschrift GD. Wenn in der Tabelle darunter GD Support enabled steht, dann ist die GD-Library installiert und man kann loslegen mit PHP Bilder zu generieren

Um ein Bild zu erstellen gibt es die Funktion imageCreate(int breite, int höhe). Um nun ein Bild zu erstellen muss man ersteinmal diese Methode aufrufen und deren Rückgabewert abfangen:

Das erste Bild

  1. <?

  2. $image = imageCreate(486,60);

  3. ?>

Allerdings benötigt man zum Bild noch etwas mehr. Um eine Farbe zu alloziieren gibt es die Funktion colorAllocate(int bild, int rot, int grün, int blau). Deren Rückgabe wert enthält die Farbe, die bei weiteren Funktionsaufrufen zum Zeichnen benutzt werden kann. Die erste Farbe, die so alloziiert wird, ist automatisch die Hintergrundfarbe. Das Skript sieht inzwischen schon so aus:

Farben alloziieren

  1. <?

  2. $image = imageCreate(486,60);

  3. $bg = colorAllocate($image,0,0,0);

  4. ?>

Die Werte 0, 0, 0 entsprechen der Farbe Schwarz. Um dieses Bild auszugeben, muss zuerst der richtige Header gesendet werden und dann das Bild. Danach sollten die auf dem Server benutzen Resourcen wieder freigegeben werden. Das sieht dann so aus:

Bild anzeigen

  1. <?

  2. $bg = colorAllocate($image,0,0,0);

  3. header("Content-type: image/png"); // Der Header wird gesendet

  4. imagePng($image); //Das Bild wird gesendet

  5. imageDestroy($image);//Resourcen werden freigegeben

  6. ?>

Hier wurde das Bild als PNG-Datei gesendet. Wenn man in header() image/jpg statt image/png schreibt und die Funktion imageJPEG statt imagePng benutzt, dann kann man das Bild auch als JPG ausgeben. Nun sollte, wenn man im Browser auf die Fatei geht, ein schwarzer Banner zu sehen sein. Keine Inhalte – Nur schwarz. Irgendwie langweilig – oder? Also: Man kann ja mal etwas hineinschreiben:

Um Text in die Grafik zu schreiben gibt es die Funktion imageString(int bild, int schriftart, int x, int y, str Text, int farbe). So sieht das dann aus:

Text

  1. <?

  2. $image = imageCreate(486,60);

  3. $bg = colorAllocate($image,0,0,0);

  4. $white = colorAllocate($image,255,255,255);

  5. imageString($image,5,25,25,"Ihr Text", $white);

  6. header("Content-type: image/png"); // Der Header wird gesendet

  7. imagePng($image); //Das Bild wird gesendet

  8. imageDestroy($image);//Resourcen werden freigegeben

  9. ?>

Jetzt müsste ein schwarzer Banner auf dem Bildschrim erscheinen, in dessen Mitte in weiß “Ihr Text” steht. Übrigens: Alle Funktionen zum Zeichnen und Co, kann man auch verwenden, wenn man als Grundlage ein bereits auf dem Server gespeichertes Bild nimmt. Dies geht mit Holfe der Funktionen imageCreateFromJPEG(str dateiname) und imageCreateFromPng(str dateiname). Diese Funktionen werden statt der Funktion imageCreate() verwendet.

Zufällige Pixel

  1. <?

  2. $image = imageCreate(470,62);

  3. $bg = imageColorAllocate($image,0,0,128);

  4. $white = imageColorAllocate($image,255,255,255);

  5. srand(time());

  6. for($i=0;$i<100;$i++){

  7. imagesetpixel($image,mt_rand(1,470),mt_rand(1,62),$white);

  8. }

  9. header("Content-Type:image/png");

  10. imagePng($image);

  11. imageDestroy($image);

  12. ?>

Jetzt wissen sie, wie man Text in ein Bild einfügt, aber dafür kann man ja auch Textdokumente benutzen. Wichtiger ist deswegen auch das Zeichnen in Bildern. Das Einfachste was man hierbei machen kann ist einen bestimmten Pixel in einer bestimmten Farbe zu setzen. Dafür gibt es die Funktion imageSetPixel(int bild, int x, int y, int farbe). Ein Beispiel, welches sehr schön zeigt was mit dieser Funktion zu realisieren ist:

Dieses PHP-Skript zeichnet eine Bilddatei in Bannergröße mit der Hintergrundfarbe Dunkelblau. Nun werden in der For-Schleife eine zufällige Anzahl von zufälligen Pixeln auf die Farbe weiß gesetzt. Das ganze sieht ein bisschen wie ein Sternenhimmel aus. Natürlich gibt es noch andere Funktionen um zu Zeichnen.

Linien
imageLine(int bild, int x1, int y1, int x2, int y2, int farbe)
imageDashedLine(int bild, int x1, int y1, int x2, int y2, int farbe)

Rechtecke
imageRectangle(int bild, int x1, int y1, int x2, int y2, int farbe)
imageFilledRectangle(int bild, int x1, int y1, int x2, int y2, int farbe)

Kreise / Ellipsen
imageEllipse(int image, int x, int y, int width, int height, int color)
imageFilledEllipse(int image, int x, int y, int width, int height, int color)

Kreisbögen
imageArc(int bild, int x, int y, int width, int height, int anfang_winkel, int end_winkel, int farbe)
imageFilledArc(int bild, int x, int y, int width, int height, int anfang_winkel, int end_winkel, int farbe, int style)

Das sind ersteinmal eine ganze Menge Funktionen. Aber die Funktionsdefinitionen sollten selbsterklärend sein: Bei den Linien sind x1, y1 bzw. x2, y2 die Start bzw. Endpunkte der Linie. Bei den Rechtecken sind sie die linke, obere bzw. die rechte, untere Ecke des Rechtecks. Bei den Kreisen stehen x und y für die Mittelpunkte der Ellipsen. Deren Höhe bzw. Breite wird durch die Parameter height und width bestimmt.

Die Kreisbögen sind ein bisschen komplizierter. Als erstes werden die selben Parameter wie bei den Kreisen benötigt. Der Anfangswinkel und Endwinkel müssen eine Zahl zwischen 0 und 360 sein, wobei 0 rechts ist und die Winkel steigen im Uhrzeigersinn verlaufen. Der Parameter Style bei der Funktion imageFilledArc ist eine / mehrere durch OR verbundene der folgenden Konstanten:

IMG_ARC_PIE
Wie ein Kuchenstück, Start und Endwinkel mit Bogen verbunden
IMG_ARC_CHORD
Start und Endwinkel mit Gerade verbunden

Eigentlich gibt es noch zwei Konstanten, aber das hier sind die meiner Meinung nach wichtigsten. Diese Funktion lässt sich z.B. zum Zeichnen eines Kreisdiagramms. Hier ein kleines Beispiel:

Ein Kreisdiagramm

  1. <?

  2. $image = imageCreate(200,200);

  3. $umfrage[1]=200;

  4. $umfrage[2]=324;

  5. $umfrage[3]=123;

  6. $umfrage_summe=$umfrage[1]+$umfrage[2]+$umfrage[3];

  7. $bg = imageColorAllocate($image,0,0,128);

  8. $farbe[1] = imageColorAllocate($image,255,255,255);

  9. $farbe[2] = imageColorAllocate($image,127,127,127);

  10. $farbe[3] = imageColorAllocate($image,10,10,10);

  11. $anf_w=270;

  12. $end_w=270;

  13. for($i=1;$i<4;$i++){

  14. $anf_w=$end_w;

  15. $stück=$umfrage[$i] / $umfrage_summe * 360;

  16. $end_w=$anf_w+$stück;

  17. imageFilledArc($image,100,100,75,75,$anf_w,$end_w,$farbe[$i], IMG_ARC_PIE);

  18. }

  19. header("Content-Type:image/png");

  20. imagePng($image);

  21. imageDestroy($image);

  22. ?>

In: , ,
— January 21, 2007


Kommentare

(verstecken)
      RSS
  1. Jesus Christus

    January 29, 2010 @17:44:55

    eBay (Frühstückstürkisch: brauchsu Handy?, korrekt lautet es eigentlich i-Bääh, doch es wird nur selten verwendet) und nicht zu verwechseln mit ThePiratEbay ist ein Internetkaufhaus mit dem Schwerpunkt auf Nutzlosem, das eh nicht gekauft wird. Experten schätzen, dass nur ca. 0,1% der Waren einen Sinn hat, der Rest wird gekauft. Diese groß angelegte Verschwörung der Firma Microsoft ist ein rein virtuelles Unternehmen, das wie alles Schlechte und Verdorbene natürlich aus Amerika kommt.

  2. Angela Merkel

    January 29, 2010 @17:47:29

    Die Verwaltung in Deutschland.

    Nach vielen Jahren sah Gott wieder einmal auf die Erde. Die Menschen waren verdorben und gewalttätig und er beschloss, sie zu vertilgen, genau so, wie er es vor langer Zeit schon einmal getan hatte.
    Er sprach zu Noah: “Noah, bau mir noch einmal eine Arche aus Zedernholz, so wie damals: 300 Ellen lang, 50 Ellen breit und 30 Ellen hoch. Ich will eine zweite Sintflut über die Erde bringen. Die Menschen haben nichts dazu gelernt. Du aber gehe mit deiner Frau, deinen Söhnen und deren Frauen in die Arche und nimm von allen Tieren zwei, je ein Männchen und ein Weibchen. In sechs Monaten werde ich den großen Regen schicken.”
    Noah stöhnte auf; musste das denn schon wieder sein? Wieder 40 Tage Regen und 150 unbequeme Tage auf dem Wasser mit all den lästigen Tieren an Bord und ohne Fernsehen! Aber Noah war gehorsam und versprach, alles genau so zu tun, wie Gott ihm aufgetragen hatte.
    Nach sechs Monaten zogen dunkle Wolken auf und es begann zu regnen. Noah saß in seinem Vorgarten und weinte, denn da war keine Arche. “Noah”, rief der Herr, “Noah, wo ist die Arche?” Noah blickte zum Himmel und sprach: “Herr, sei mir gnädig.” Gott fragte abermals: “Wo ist die Arche, Noah??
    Da trocknete Noah seine Tränen und sprach: “Herr, was hast du mir angetan? Als Erstes beantragte ich beim Landkreis eine Baugenehmigung. Die dachten zuerst, ich wollte einen extravaganten Schafstall bauen. Die kamen mit der ausgefallenen Bauform nicht zurecht, denn an einen Schiffbau wollten sie nicht glauben.
    Auch deine Maßangaben stifteten Verwirrung, weil niemand mehr weiß, wie lang eine Elle ist. Also musste mein Architekt einen neuen Plan entwerfen. Die Baugenehmigung wurde zunächst abgelehnt, weil eine Werft in einem Wohngebiet planungsrechtlich unzulässig sei. Nachdem ich dann endlich ein passendes Gewerbegrundstück gefunden hatte, gab es nur noch Probleme. Im Moment geht es z.B. um die Frage, ob die Arche feuerhemmende Türen, eine Sprinkleranlage und einen Löschwassertank benötige. Auf einen Hinweis, ich hätte im Ernstfall rundherum genug Löschwasser, glaubten die Beamten, ich wollte mich über sie lustig machen.
    Als ich ihnen erklärte, das Wasser käme noch in großen Mengen, und zwar viel mehr als ich zum Löschen benötigte, brachte mir das den Besuch eines Arztes vom Landeskrankenhaus ein. Er wollte von mir wissen, was ein Schiffbau auf dem Trockenen, fernab von jedem Gewässer, solle.
    Die Bezirksregierung teilte mir daraufhin telefonisch mit, ich könnte ja gern ein Schiff bauen, müsste aber selbst zusehen, wie es zum nächsten größeren Fluss käme. Mit dem Bau eines Sperrwerks könnte ich nicht rechnen, nachdem der Ministerpräsident zurückgetreten sei.
    Dann rief mich noch ein anderer Beamter dieser Behörde an, der mir erklärte, sie seien inzwischen ein kundenorientiertes Dienstleistungsunternehmen und darum wolle er mich darauf hinweisen, dass ich bei der EU in Brüssel eine Werftbeihilfe beantragen könne; allerdings müsste der Antrag achtfach in den drei Amtssprachen eingereicht werden.
    Inzwischen ist beim Verwaltungsgericht ein vorläufiges Rechtsschutzverfahren meines Nachbarn anhängig, der einen Großhandel für Tierfutter betreibt. Der hält das Vorhaben für einen großen Werbegag – mein Schiffbau sei nur darauf angelegt, ihm Kunden abspenstig zu machen. Ich habe ihm schon zwei Mal erklärt, dass ich gar nichts verkaufen wolle. Er hört mir gar nicht zu und das Verwaltungsgericht hat offenbar auch viel Zeit.
    Die Suche nach dem Zedernholz habe ich eingestellt. Libanesische Zedern dürfen nicht mehr eingeführt werden. Als ich deshalb hier im Wald Bauholz beschaffen wollte, wurde mir das Fällen von Bäumen – unter Hinweis auf das Landeswaldgesetz verweigert. Dies schädige den Naturhaushalt und das Klima. Außerdem sollte ich erst eine Ersatzaufforstung nachweisen. Mein Einwand, in Kürze werde es gar keine Natur mehr geben und das Pflanzen von Bäumen an anderer Stelle sei deshalb völlig sinnlos, brachte mir den zweiten Besuch des Arztes vom Landeskrankenhaus ein.
    Die angeheuerten Zimmerleute versprachen mir schließlich, für das notwendige Holz selbst zu sorgen. Sie wählten jedoch erst einmal einen Betriebsrat. Der wollte mit mir zunächst einen Tarifvertrag für den Holzschiffbau auf dem flachen Lande ohne Wasserkontakt aushandeln. Weil wir uns aber nicht einig wurden, kam es zu einer Urabstimmung und zum Streik. Herr, weißt du eigentlich, was Handwerker heute verlangen? Wie soll ich denn das bezahlen?
    Weil die Zeit drängte, fing ich schon einmal an, Tiere einzusammeln. Am Anfang ging das noch ganz gut, vor allem die beiden Ameisen sind noch immer wohlauf. Aber seit ich zwei Tiger und zwei Schafe von der Notwendigkeit ihres gemeinsamen und friedlichen Aufenthaltes bei mir überzeugt hatte, meldete sich der örtliche Tierschutzverein und rügte die artwidrige Haltung. Und mein Nachbar klagt auch schon wieder, weil er auch die Eröffnung eines Zoos für geschäftsschädigend hält.
    Herr, ist dir eigentlich klar, dass ich auch nach der Europäischen Tierschutztransportverordnung eine Genehmigung brauche? Ich bin schon auf Seite 22 des Formulars und grüble im Moment darüber, was ich als Transportziel angeben soll.
    Und wusstest du, dass z. B Geweih tragende Tiere während der Brunftzeit überhaupt nicht transportiert werden dürfen? Und die Hirsche sind ständig am Schnackeln, wie Fürstin Gloria sagen würde und auch der gemeine Elch und Ochse denken an nichts anderes, besonders die südlicheren!
    Herr, wusstest du das? Übrigens, wo hast du eigentlich die Callipepia Caliconica – du weißt schon, die Schopfwachteln und den Lethamus Discolor versteckt? Den Schwalbensittich habe ich bisher auch nicht finden können.
    Dir ist natürlich auch bewusst, dass ich die 43 Vorschriften der Binnenmarkt-Tierschutzverordnung bei dem Transport der Kaninchen strikt beachten muss. Meine Rechtsanwälte prüfen gerade, ob diese Vorschriften auch für Hasen gelten.
    Übrigens: wenn du es einrichten könntest, die Arche als fremdflaggiges Schiff zu deklarieren, das sich nur im Bereich des deutschen Küstenmeeres aufhält, bekäme ich die Genehmigung viel einfacher. Du könntest dich doch auch einmal für mich bemühen. Ein Umweltschützer von Greenpeace erklärte mir, dass ich Gülle, Jauche, Exkremente und Stallmist nicht im Wasser entsorgen darf. Wie stellst du dir das eigentlich vor? Damals ging es doch auch!
    Vor zwei Wochen hat sich das Oberkommando der Marine bei mir gemeldet und von mir eine Karte der künftig überfluteten Gebiete erbeten. Ich habe ihnen einen blau angemalten Globus geschickt.
    Und vor zehn Tagen erschien die Steuerfahndung; die haben den Verdacht, ich bereite meine Steuerflucht vor. Ich komme so nicht weiter Herr, ich bin verzweifelt! Soll ich nicht doch lieber meinen Rechtsanwalt mit auf die Arche nehmen?”
    Noah fing wieder an zu weinen. Da hörte der Regen auf, der Himmel klarte auf und die Sonne schien wieder. Und es zeigte sich ein wunderschöner Regenbogen. Noah blickte auf und lächelte. “Herr, du wirst die Erde doch nicht zerstören?”
    Da sprach der Herr: “Darum sorge ich mich nicht mehr, das schafft schon eure Verwaltung!”

Gib deine Meinung ab!


(notwendig)






Stoppt die Vorratsdatenspeicherung! Jetzt klicken & handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien: