PHP Image erstellen mit Daten aus Datenbank
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
anpassen
array
ausgabe
beispiel
bild
code
header
http
image
kartennummer
machen
manual
nummer
ordern
string
text
type
url
zeile
-
Hallo !
Ich habe ein Script programmiert, das mir ein Bild ausgibt, mit Daten aus meiner Datenbank.
Erstmal das Script:
<?php include 'sql.php'; $abfrage = "SELECT kartennummer FROM kv_karten order by kartennummer asc"; $loesung = mysql_query($abfrage) or die(mysql_error()); while ($row = mysql_fetch_array($loesung, MYSQL_ASSOC)) { $ausgabe .= "$row[kartennummer] "; } Header("Content-Type: image/png"); $width = 500; $height = 300; $img = ImageCreate($width, $height); $black = ImageColorAllocate($img, 0, 0, 0); $white = ImageColorAllocate($img, 255, 255, 255); ImageFill($img, 0, 0, $black); ImageString($img, 2, 26, 20, "Verfügbare Kartennummern: " . $ausgabe . "", $white); ImagePNG($img); ImageDestroy($img) ?>
Das klappt auch ganz gut. Allerdings wird die ganze Ausgabe in einer Zeile ausgegeben, sodass man mehr als die Hälfte garnicht sieht. Wie kann ich einen Zeilenumbruch machen?
Ich habe es schon mit \r probiert, aber PHP macht keinen Zeilenumbruch.
Könnt Ihr mir helfen? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
php-oop schrieb:
Einfach kopieren und nutzen!
hackyourlife schrieb:
Hier ist ein Beispiel das genau das macht was du willst.
Daraus werde ich irgendwie nicht schlau. Wie muss ich mein Script anpassen, damit das funktioniert?
Für dich mal zusammenkopiert:
Ich habe angenommen dass du folgendes haben möchtest:<?php // kopierte Funktion von http://at.php.net/manual/de/function.imagestring.php#90481 function sendimagetext($text) { // Set font size $font_size = 4; $ts=explode("\n",$text); $width=0; foreach ($ts as $k=>$string) { //compute width $width=max($width,strlen($string)); } // Create image width dependant on width of the string $width = imagefontwidth($font_size)*$width; // Set height to that of the font $height = imagefontheight($font_size)*count($ts); $el=imagefontheight($font_size); $em=imagefontwidth($font_size); // Create the image pallette $img = imagecreatetruecolor($width,$height); // Dark red background $bg = imagecolorallocate($img, 0xAA, 0x00, 0x00); imagefilledrectangle($img, 0, 0,$width ,$height , $bg); // White font color $color = imagecolorallocate($img, 255, 255, 255); foreach ($ts as $k=>$string) { // Length of the string $len = strlen($string); // Y-coordinate of character, X changes, Y is static $ypos = 0; // Loop through the string for($i=0;$i<$len;$i++){ // Position of the character horizontally $xpos = $i * $em; $ypos = $k * $el; // Draw character imagechar($img, $font_size, $xpos, $ypos, $string, $color); // Remove character from string $string = substr($string, 1); } } // Return the image header("Content-Type: image/png"); imagepng($img); // Remove image imagedestroy($img); } // dein Code include 'sql.php'; $abfrage = 'SELECT kartennummer FROM kv_karten order by kartennummer asc'; $loesung = mysql_query($abfrage) or die(mysql_error()); while ($row = mysql_fetch_array($loesung, MYSQL_ASSOC)) { $ausgabe .= " $row[kartennummer] \n"; // möglicherweise muss hier was angepasst werden... } // du musst dir überlegen wo du die Zeilenumbrüche haben möchtest... sendimagetext("Verfügbare Kartennummern:\n$ausgabe"); ?>
Ansonsten musst du die Zuweisung in deiner Schleife sowie den Aufruf von sendimagetext etwas anpassen (Zeilenumbrüche).Verfügbare Kartennummern: nummer 1 nummer 2
Das wird dir auf jeden Fall ein Bild erstellen wo immer der gesamte Text lesbar sein wird. -
Zeilenumbrüche in der Ausgabe lassen sich in der Regel mit dem HTML-Tag <br /> darstellen...
Beitrag zuletzt geändert: 25.12.2011 12:35:37 von alfr3d -
alfr3d schrieb:
Es geht hierbei nicht um eine HTML-Ausgabe sondern (wie der Titel schon sagt) um eine Ausgabe in ein Bild!
Zeilenumbrüche in der Ausgabe lassen sich in der Regel mit dem HTML-Tag <br /> darstellen... -
hackyourlife schrieb:
php-oop schrieb:
Einfach kopieren und nutzen!
hackyourlife schrieb:
Hier ist ein Beispiel das genau das macht was du willst.
Daraus werde ich irgendwie nicht schlau. Wie muss ich mein Script anpassen, damit das funktioniert?
Für dich mal zusammenkopiert:
Ich habe angenommen dass du folgendes haben möchtest:<?php // kopierte Funktion von http://at.php.net/manual/de/function.imagestring.php#90481 function sendimagetext($text) { // Set font size $font_size = 4; $ts=explode("\n",$text); $width=0; foreach ($ts as $k=>$string) { //compute width $width=max($width,strlen($string)); } // Create image width dependant on width of the string $width = imagefontwidth($font_size)*$width; // Set height to that of the font $height = imagefontheight($font_size)*count($ts); $el=imagefontheight($font_size); $em=imagefontwidth($font_size); // Create the image pallette $img = imagecreatetruecolor($width,$height); // Dark red background $bg = imagecolorallocate($img, 0xAA, 0x00, 0x00); imagefilledrectangle($img, 0, 0,$width ,$height , $bg); // White font color $color = imagecolorallocate($img, 255, 255, 255); foreach ($ts as $k=>$string) { // Length of the string $len = strlen($string); // Y-coordinate of character, X changes, Y is static $ypos = 0; // Loop through the string for($i=0;$i<$len;$i++){ // Position of the character horizontally $xpos = $i * $em; $ypos = $k * $el; // Draw character imagechar($img, $font_size, $xpos, $ypos, $string, $color); // Remove character from string $string = substr($string, 1); } } // Return the image header("Content-Type: image/png"); imagepng($img); // Remove image imagedestroy($img); } // dein Code include 'sql.php'; $abfrage = 'SELECT kartennummer FROM kv_karten order by kartennummer asc'; $loesung = mysql_query($abfrage) or die(mysql_error()); while ($row = mysql_fetch_array($loesung, MYSQL_ASSOC)) { $ausgabe .= " $row[kartennummer] \n"; // möglicherweise muss hier was angepasst werden... } // du musst dir überlegen wo du die Zeilenumbrüche haben möchtest... sendimagetext("Verfügbare Kartennummern:\n$ausgabe"); ?>
Ansonsten musst du die Zuweisung in deiner Schleife sowie den Aufruf von sendimagetext etwas anpassen (Zeilenumbrüche).Verfügbare Kartennummern: nummer 1 nummer 2
Das wird dir auf jeden Fall ein Bild erstellen wo immer der gesamte Text lesbar sein wird.
Danke! Das hat mir sehr geholfen!
Habe nur noch eine Frage: Wie kann ich die While Schleife so anpassen, dass immer nach 5 Nummern ein Zeilenumbruch erfolgt, und nicht nach jeder?
Beitrag zuletzt geändert: 25.12.2011 13:15:46 von php-oop -
$i = 0; while(irgendwas) { $i++; if($i % 5 == 0) { // mach irgendwas (Zeilenumbruch) } $i %= 5; }
-
hackyourlife schrieb:
$i = 0; while(irgendwas) { $i++; if($i % 5 == 0) { // mach irgendwas (Zeilenumbruch) } $i %= 5; }
Hi !
Danke für deine Antwort.
Ich habe mein Script jetzt so umgebaut:
... $i = 0; while ($row = mysql_fetch_array($loesung, MYSQL_ASSOC)) { $i++; if($i % 5 == 0) { "\n"; } $i %= 5; $ausgabe .= " $row[kartennummer] \n"; // möglicherweise muss hier was angepasst werden... } sendimagetext("Verfügbare Kartennummern:\n$ausgabe");
Es geht aber noch nicht. Es wird immer eine Zahl in einer Reihe angezeigt.
Was mache ich noch falsch? -
ImageString() kann mit Zeilenumbrüchen nichts anfangen!
Nimm deinen Ausgabestring, teile ihn in passende Blöcke auf und schreibe JEDEN mit einem eigene Aufruf von ImageString() in das Bild. Die Ausgabeposition im Bild mußt Du dann natürlich bei jedem Aufruf anpassen, so daß einzelne Zeilen im Bild entstehen.
FF -
Ich hab dir mal schnell eine Funktion geschrieben, die aus einem Array via ImageString mehrere Einträge untereinander ins Bild schreibt. Dazu musst du nur die Ausgabe als Array, nicht als String gestalten:
<?php function imagestring_array ( $img, $font, $font_shift, $x, $y, $array, $color ) { $shift_y = 0; foreach ( $array as $row ) { ImageString ( $img, $font, $x, $y + $shift_y, $row, $color ); $shift_y = $shift_y + $font_shift; } } ?>
Kurze Erklärung:
$img: Die Image-Ressource
$font: Font-Typ: Integer zwischen 1 und 5
$font_shift: Der Abstand zwischen zwei Zeilen
$x: X-Koordinate von der ersten Zeile
$y: Y-Koordinate von der ersten Zeile
$array: Der Array, in dem die einzelnen String-Zeilen sind (bei dir $ausgabe)
$color: Die Farbe vom Text
Hier die Umsetzung in deinem Beispiel (ungetestet):
<?php function imagestring_array ( $img, $font_size, $font_shift, $x, $y, $array, $color ) { $shift_y = 0; foreach ( $array as $row ) { ImageString ( $img, $font_size, $x, $y + $shift_y, $row, $color ); $shift_y = $shift_y + $font_shift; } } include 'sql.php'; $abfrage = "SELECT kartennummer FROM kv_karten order by kartennummer asc"; $loesung = mysql_query($abfrage) or die(mysql_error()); $ausgabe = array(); $i = 0; while ($row = mysql_fetch_array($loesung, MYSQL_ASSOC)) { $i++; $ausgabe[$i] = "$row[kartennummer] "; } Header("Content-Type: image/png"); $width = 500; $height = 300; $img = ImageCreate($width, $height); $black = ImageColorAllocate($img, 0, 0, 0); $white = ImageColorAllocate($img, 255, 255, 255); ImageFill($img, 0, 0, $black); ImageString($img, 2, 26, 20, "Verfügbare Kartennummern: ", $white); imagestring_array($img, 2, 12, 26, 32, $ausgabe, $white); ImagePNG($img); ImageDestroy($img) ?>
Ich hoffe, ich konnte dir damit helfen.
Gruß mermadalis -
mermadalis schrieb:
Ich hab dir mal schnell eine Funktion geschrieben, die aus einem Array via ImageString mehrere Einträge untereinander ins Bild schreibt. Dazu musst du nur die Ausgabe als Array, nicht als String gestalten:
<?php function imagestring_array ( $img, $font, $font_shift, $x, $y, $array, $color ) { $shift_y = 0; foreach ( $array as $row ) { ImageString ( $img, $font, $x, $y + $shift_y, $row, $color ); $shift_y = $shift_y + $font_shift; } } ?>
Kurze Erklärung:
$img: Die Image-Ressource
$font: Font-Typ: Integer zwischen 1 und 5
$font_shift: Der Abstand zwischen zwei Zeilen
$x: X-Koordinate von der ersten Zeile
$y: Y-Koordinate von der ersten Zeile
$array: Der Array, in dem die einzelnen String-Zeilen sind (bei dir $ausgabe)
$color: Die Farbe vom Text
Hier die Umsetzung in deinem Beispiel (ungetestet):
<?php function imagestring_array ( $img, $font_size, $font_shift, $x, $y, $array, $color ) { $shift_y = 0; foreach ( $array as $row ) { ImageString ( $img, $font_size, $x, $y + $shift_y, $row, $color ); $shift_y = $shift_y + $font_shift; } } include 'sql.php'; $abfrage = "SELECT kartennummer FROM kv_karten order by kartennummer asc"; $loesung = mysql_query($abfrage) or die(mysql_error()); $ausgabe = array(); $i = 0; while ($row = mysql_fetch_array($loesung, MYSQL_ASSOC)) { $i++; $ausgabe[$i] = "$row[kartennummer] "; } Header("Content-Type: image/png"); $width = 500; $height = 300; $img = ImageCreate($width, $height); $black = ImageColorAllocate($img, 0, 0, 0); $white = ImageColorAllocate($img, 255, 255, 255); ImageFill($img, 0, 0, $black); ImageString($img, 2, 26, 20, "Verfügbare Kartennummern: ", $white); imagestring_array($img, 2, 12, 26, 32, $ausgabe, $white); ImagePNG($img); ImageDestroy($img) ?>
Ich hoffe, ich konnte dir damit helfen.
Gruß mermadalis
Hi !
Danke für deine Antwort!
Ich hab hier mal das komplette Script kopiert:
<?php function imagestring_array ( $img, $font_size, $font_shift, $x, $y, $array, $color ) { $shift_y = 0; foreach ( $array as $row ) { ImageString ( $img, $font_size, $x, $y + $shift_y, $row, $color ); $shift_y = $shift_y + $font_shift; } } include 'sql.php'; $abfrage = "SELECT kartennummer FROM kv_karten order by kartennummer asc"; $loesung = mysql_query($abfrage) or die(mysql_error()); $i = 0; while ($row = mysql_fetch_array($loesung, MYSQL_ASSOC)) { $i++; $ausgabe[$i] = "$row[kartennummer] "; } Header("Content-Type: image/png"); $width = 500; $height = 300; $img = ImageCreate($width, $height); $black = ImageColorAllocate($img, 0, 0, 0); $white = ImageColorAllocate($img, 255, 255, 255); ImageFill($img, 0, 0, $black); ImageString($img, 2, 26, 20, "Verfügbare Kartennummern: ", $white); imagestring_array($img, 2, 12, 26, 32, $ausgabe, $white); ImagePNG($img); ImageDestroy($img) ?>
Es wird immernoch in jeder Zeile nur eine Nummer angezeigt. Wie schaffe ich es, 5 Nummern in einer Zeile anzuzeigen?
Zum Testen: http://davidlohmann.de/kartenverwaltung/image.php -
Um eine bestimmte Anzahl pro Reihe zu haben, musst du die Funktion dementsprechend verändern. Ich hab das hier mal gemacht:
function imagestring_array ( $img, $font_size, $per_row, $font_shift, $x, $y, $array, $color ) { $shift_y = 0; $count = 0; foreach ( $array as $row ) { if ( $count < $per_row ) { if ( $count == 0 ) $rowtext = $row; else $rowtext .= ' ' . $row; $count++; } else { ImageString ( $img, $font_size, $x, $y + $shift_y, $rowtext, $color ); $shift_y = $shift_y + $font_shift; $count = 0; } } }
Zu beachten: Ich hab ein weiteres Funktions-Parameter hinzugefügt ($per_row), das angibt, wieviele Einträge pro Zeile eingetragen werden sollen. Das musst du dann im Script dementsprechend ändern.
Hier ein Bild, das ich damit generiert habe: http://imagr.eu/up/4ef77b4f56c466_test.php.png -
mermadalis schrieb:
Um eine bestimmte Anzahl pro Reihe zu haben, musst du die Funktion dementsprechend verändern. Ich hab das hier mal gemacht:
function imagestring_array ( $img, $font_size, $per_row, $font_shift, $x, $y, $array, $color ) { $shift_y = 0; $count = 0; foreach ( $array as $row ) { if ( $count < $per_row ) { if ( $count == 0 ) $rowtext = $row; else $rowtext .= ' ' . $row; $count++; } else { ImageString ( $img, $font_size, $x, $y + $shift_y, $rowtext, $color ); $shift_y = $shift_y + $font_shift; $count = 0; } } }
Zu beachten: Ich hab ein weiteres Funktions-Parameter hinzugefügt ($per_row), das angibt, wieviele Einträge pro Zeile eingetragen werden sollen. Das musst du dann im Script dementsprechend ändern.
Hier ein Bild, das ich damit generiert habe: http://imagr.eu/up/4ef77b4f56c466_test.php.png
Super, danke! Genau das hab ich gesucht.
Jetzt klappt alles :) -
php-oop schrieb:
Das musst du etwas anders machen:
Ich habe mein Script jetzt so umgebaut:
... $i = 0; while ($row = mysql_fetch_array($loesung, MYSQL_ASSOC)) { $i++; if($i % 5 == 0) { "\n"; } $i %= 5; $ausgabe .= " $row[kartennummer] \n"; // möglicherweise muss hier was angepasst werden... } sendimagetext("Verfügbare Kartennummern:\n$ausgabe");
Es geht aber noch nicht. Es wird immer eine Zahl in einer Reihe angezeigt.
Was mache ich noch falsch?
So hätte es mit meinem Code funktioniert...$i = 0; $ausgabe = ''; while ($row = mysql_fetch_array($loesung, MYSQL_ASSOC)) { $i++; $ausgabe .= " $row[kartennummer]"; if($i % 5 == 0) { $ausgabe .= "\n"; } $i %= 5; } sendimagetext("Verfügbare Kartennummern:\n$ausgabe");
Die Nummern werden immer 1 Leerzeichen eingerückt sein.
Aber nachdem du es schon anders gelöst hast ist das nur der Vollständigkeit halber -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage