kostenloser Webspace werbefrei: lima-city


PHP Image erstellen mit Daten aus Datenbank

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    php-oop

    php-oop hat kostenlosen Webspace.

    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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Hier ist ein Beispiel das genau das macht was du willst.
  4. Autor dieses Themas

    php-oop

    php-oop hat kostenlosen Webspace.

    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?
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    php-oop schrieb:
    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?
    Einfach kopieren und nutzen!
    Für dich mal zusammenkopiert:
    <?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");
    ?>
    Ich habe angenommen dass du folgendes haben möchtest:
    Verfügbare Kartennummern:
       nummer 1
       nummer 2
    Ansonsten musst du die Zuweisung in deiner Schleife sowie den Aufruf von sendimagetext etwas anpassen (Zeilenumbrüche).

    Das wird dir auf jeden Fall ein Bild erstellen wo immer der gesamte Text lesbar sein wird.
  6. 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
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    alfr3d schrieb:
    Zeilenumbrüche in der Ausgabe lassen sich in der Regel mit dem HTML-Tag <br /> darstellen...
    Es geht hierbei nicht um eine HTML-Ausgabe sondern (wie der Titel schon sagt) um eine Ausgabe in ein Bild!
  8. Autor dieses Themas

    php-oop

    php-oop hat kostenlosen Webspace.

    hackyourlife schrieb:
    php-oop schrieb:
    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?
    Einfach kopieren und nutzen!
    Für dich mal zusammenkopiert:
    <?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");
    ?>
    Ich habe angenommen dass du folgendes haben möchtest:
    Verfügbare Kartennummern:
       nummer 1
       nummer 2
    Ansonsten musst du die Zuweisung in deiner Schleife sowie den Aufruf von sendimagetext etwas anpassen (Zeilenumbrüche).

    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
  9. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    $i = 0;
    while(irgendwas) {
    	$i++;
    	if($i % 5 == 0) {
    		// mach irgendwas (Zeilenumbruch)
    	}
    	$i %= 5;
    }
  10. Autor dieses Themas

    php-oop

    php-oop hat kostenlosen Webspace.

    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?
  11. 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
  12. 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
  13. Autor dieses Themas

    php-oop

    php-oop hat kostenlosen Webspace.

    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
  14. 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
  15. Autor dieses Themas

    php-oop

    php-oop hat kostenlosen Webspace.

    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 :)
  16. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    php-oop schrieb:
    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?
    Das musst du etwas anders machen:
    $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");
    So hätte es mit meinem Code funktioniert...
    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 ;-)
  17. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!