PHP und gd Problem



  • Guten Abend,

    ich hab folgendes Problem. Wenn ich mit den PHP(gd) Funktion ein Bild erstelle, und dieses mittels Funktion aufrufe bekomme ich nur kryptische Zeichen aber kein Bild. Des Weitern bekomm ich den Hinweis das der Header schon gesendet wurde.

    Wäre um Lösungsansätze oder um Lösungswege sehr dankbar.

    <?
    function bla($Text)
    {
    	header("Content-Type: image/PNG");
    	$Image = Imagecreate("200", "80");
    	$ColorImage = imagecolorallocate($Image,42,152,156);
    	$ColorText = imagecolorallocate($Image,0,0,0);
    	ImageTTFText($Image,18,0,18,48,$ColorText,"Arial",$Text);
    	Imagepng($Image);
    	Imagedestroy($Image);
    }
    ?>
    
    <?
    	include 'image.php';
    ?>
    <html>
     <head>
       <title>Test</title>
     </head>
     <body>
    	  Bla bla bla bla bla bla bla bla bla bla bla bla bla
    	  <br><br>
    	  <?
    		echo"<img src='".bla("Hallo")."'>";
    	  ?>
     </body>
    </html>
    


  • Soviel ich weiss muss beim "src"-attributs des "img"-Tags eine URL angegeben werden und keine Bytes ausgespuckt werden...

    Header schon gesendet heisst meistens, dass du noch vor deine "header()"-Aufrufe bereits (ein) Zeichen gesendet hast, was du nicht darfst.
    Evtl. prüfen ob vor dem "<?php" bereits ein leerzeichen oder zeilenumbruch zu finden ist.

    Am einfachsten ist es als allererstes ein
    <? ob_start(); ?>
    zu setzen, dann wird die gesamte ausgabe erst in einen buffer geschrieben und du kannst header() aufrufen wo du willst.
    Am Ende des Scripts kannst du dann mit <? ob_end_flush(); ?> direkt die gebufferte Ausgabe an den Browser raushauen...



  • geeky schrieb:

    Header schon gesendet heisst meistens, dass du noch vor deine "header()"-Aufrufe bereits (ein) Zeichen gesendet hast, was du nicht darfst.
    Evtl. prüfen ob vor dem "<?php" bereits ein leerzeichen oder zeilenumbruch zu finden ist.

    Naja, das wird (hier) wohl eher daher kommen, dass header() in der Funktion bla() aufgerufen wird, die wiederum als src-Attribut aufgerufen wird.
    Das heißt, die Funktion zum Bild erstellen in eine separate Datei zu verlagern, würde wohl beide Probleme lösen. 🙂



  • Das sind ja zwei Datei, deshalb auch der include in der zweiten 😉



  • hallo

    eine unsportliche variante wäre, ein immer wieder überschreibbares bild fest zu codieren:

    <?
    function bla($Text)
    {    
        $Image = Imagecreate("200", "80");
        $ColorImage = imagecolorallocate($Image,42,152,156);
        $ColorText = imagecolorallocate($Image,0,0,0);
        ImageTTFText($Image,18,0,18,48,$ColorText,"Arial",$Text);
        Imagepng($Image, "test.png");
        Imagedestroy($Image);
    }
    ?>
    
    <?   
        include 'image.php';
        bla("hallo");
    ?>
    <html>
     <head>
       <title>Test</title>
     </head>
     <body>
          Bla bla bla bla bla bla bla bla bla bla bla bla bla
          <br><br>
          <?
            echo"<img src='test.png'>";
          ?>
     </body>
    </html>
    

    damit entfällt header und der vorherige html output.



  • Das ist ne Möglichkeit. Wenn es nicht anderes Funktioniert werd ich das woll so lösen. Nur dynamisch wär mir lieber, also ohnen das Bild auf dem Server zwischen zuspeichern.



  • In dem Fall mußt du als Ziel des <img> dein PHP-Script angeben:

    image.php:

    <?
      header("Content-Type: image/PNG");
      //Bilderzeugung
    ?>
    
    ...
    <img src='image.php'>
    ...
    


  • CStoll schrieb:

    In dem Fall mußt du als Ziel des <img> dein PHP-Script angeben:

    image.php:

    <?
      header("Content-Type: image/PNG");
      //Bilderzeugung
    ?>
    
    ...
    <img src='image.php'>
    ...
    

    Dieser Schritt ist mir bekannt. Nun ist das oben ein einfaches Beispiel. Meine eigentliche Funktion erstellt ein Diagramm und bekommt ein Array übergeben. Man könnte die Variablen auch per GET übergeben nur ist das Array sehr groß und sprengt die größe von GET.



  • entweder die header wegmachen oder src="image.php" udn nciht includen!


Anmelden zum Antworten