DerBaer: Grafik erstellen

Hi,

ich möchte eine Klasse erstellen, die mir aus übergeben Daten ein Bild "zusammenbaut" und das dann irgendwie in einer HTML-Seite anzeigt.
Das ganz soll in 2 Dateien aufgeteilt werden:

  1. Die HauptDatei:
<?php  
 include("plotter.class.php");  
 $p = new Plotter();  
 $p->createImage();  
?>
  1. die KLasse zum erstellen der Grafik:
<?php  
class Plotter {  
  
 // Daten  
 var $data = array(10, 20, 40,  220, 50, 70, 100, 20, 15, 45, 20);  
  
 function createImage() {  
  Header("Content-Type: image/png");  
  
  # Hier wird der Header gesendet, der später die Bilder "rendert" ausser png kann auch jpeg dastehen  
  $width = 500; # Später die Breite des Rechtecks  
  $height = 200; # Später die Höhe des Rechtecks  
  $img = ImageCreate($width, $height); # Hier wird das Bild einer Variable zu gewiesen  
  $black = ImageColorAllocate($img, 0, 0, 0); # Hier wird der Variable $black die Farbe schwarz zugewiesen  
  $green = ImageColorAllocate($img, 0, 255, 0); # Hier wird der Variable $black die Farbe schwarz zugewiesen  
  # Die drei nullen bestehen aus den RGB-Parametern. 255, 0, 0 wäre z.B. rot. ($img muss am Anfang stehen)  
  ImageFill($img, 0, 0, $black); # Hier wird mit ImageFill() das Bild gefüllt an den Koordinaten 0 und 0 mit der Variable $black, also Schwarz  
  for ($i = 0; $i < 11; $i++) {  
   ImageLine($img, $i * 20, $height - $this->$data[$i], $i * 20 + 20, $height - $this->$data[$i + 1], $green);  
  }  
  ImagePNG($img); # Hier wird das Bild PNG zugewiesen  
  //ImageDestroy($img);  
 }  
}  
?>

Momentan wird nur ein schwarzes rechteck gezeichnet. Weiß jemand was ich falsch mache?

Mfg

  1. Hi,

    du musst statt $this->$data nur $this->data verwenden. Dann funktioniert alles!!

    mfg, Flo

    1. echo $begrüßung;

      du musst statt $this->$data nur $this->data verwenden. Dann funktioniert alles!!

      Ah, sieh an, ich hab gestern Anbend auch drübergeschaut, es war mir aber nicht aufgefallen. Aufgefallen ist es aber sicher dem PHP, nur durfte es vermutlich nichts sagen, weil es üblicherweise mit einem error_reporting-Wert ohne E_NOTICE betrieben wird. Stellt man es auf E_ALL (und display_errors auf on) sieht man Zugriffe auf nicht vorhande Variablen, weil die mit einer Notice gemeldet werden. Beim Entwickeln ist es immer eine gute Idee, mit E_ALL zu arbeiten.

      echo "$verabschiedung $name";

      1. Hi,

        du musst statt $this->$data nur $this->data verwenden. Dann funktioniert alles!!

        Ah, sieh an, ich hab gestern Anbend auch drübergeschaut, es war mir aber nicht aufgefallen. Aufgefallen ist es aber sicher dem PHP, nur durfte es vermutlich nichts sagen, weil es üblicherweise mit einem error_reporting-Wert ohne E_NOTICE betrieben wird. Stellt man es auf E_ALL (und display_errors auf on) sieht man Zugriffe auf nicht vorhande Variablen, weil die mit einer Notice gemeldet werden. Beim Entwickeln ist es immer eine gute Idee, mit E_ALL zu arbeiten.

        Das kann ja durchaus der Fall gewesen sein - nur wenn im Script vorher schon

        Header("Content-Type: image/png");

        steht, dann kann PHP so laut vor Schmerzen schreien, wie es will - der Schrei verhallt meist ungehoert, weil der Browser nun mal ein Bild erwartet, und dieses hoechstens als "kaputt" anzeigt, wenn es irgendwo komischen Text wie bspw. PHP-Meldungen enthaelt.

        Deshalb rate ich bei solchen Scripten, den header-Aufruf erst ganz zum Schluss vor dem Aufruf von imagejpeg zu platzieren - dann hat PHP bei davor auftretenden Fehlern wenigstens noch die Chance, auf sich aufmerksam zu machen (sofern man das ganze ueber Direktaufruf des Bild-Scriptes testest - bei Einbindung ueber <img> nutzt es auch wenig).

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hallo,

          Selbst wenn du dir den Quelltext anguckst, werden E_NOTICE und E_STRICT teilweise nicht angezeigt, wennn sie in einer gdlib-Funktion aufgerufen werden. Dies kann man iwo in der php.ini einstellen. Ist ziemlich unbekannt, kann (und soll) aber trotz eingeschaltetem E_ALL für korrekte Bilder sorgen...

          mfg, Flo

          --
          --
          Developers are dying. Computers are getting trash. CEO's become forgetten. The only remaining things are ideas, lies and crises. So if you want to be immortal, first think, than stop it and go to microsoft and become later a manager at Lehman Brothers...
          1. Hi,

            Selbst wenn du dir den Quelltext anguckst, werden E_NOTICE und E_STRICT teilweise nicht angezeigt, wennn sie in einer gdlib-Funktion aufgerufen werden. Dies kann man iwo in der php.ini einstellen. Ist ziemlich unbekannt, kann (und soll) aber trotz eingeschaltetem E_ALL für korrekte Bilder sorgen...

            Meinst du gd.jpeg_ignore_warning?
            War mir bisher nicht bekannt, aber gibt's ja auch erst seit PHP 5.1.3

            Wirkt aber laut Beschreibung nur bei jpeg2wbmp und imagecreatefromjpeg.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
      2. Hab ich auch angestellt, aber das hat trotzdem nur angezeigt "Fehler im Bild". Ich hab sogar E_ALL|E_STRICT benutzt!

        1. echo $begrüßung;

          Hab ich auch angestellt, aber das hat trotzdem nur angezeigt "Fehler im Bild". Ich hab sogar E_ALL|E_STRICT benutzt!

          Wenn es einen Fehler im Bild gibt, dann war das die Meldung, die der Browser als nicht dem Bildformat entsprechenden Daten erkannt hat und sich beschwert. Du müsstest dir dann den Bildquelltext ansehen, dann siehst du sie.

          Besser ist es in dem Fall, per error_log in eine Datei zu protokollieren, die man im Auge behält. Unter Unix-Systemen kann man mit tail -f dateiname zuschauen, wie die Datei gefüllt wird. Unter Windows gibt es bestimmt Nachbildungen davon, ansonsten gibt es auch einige Editoren, die sich melden, wenn sich der Inhalt einer Datei geändert hat.

          echo "$verabschiedung $name";

    2. Vielen dank für die Antwort.

      Ich bin leider erst jetzt zum testen gekommen, aber mit dem ->data geht es, d.h. es wird ein bild mit linien angezeigt.

      Aber was muss ich jetzt machen, damit ich es in eine richtige html-seite einbinden kann? Ich möchte z.B. Eine ÜBercschrift, dann das bild und am ende noch einen kleinen text. Wenn ich allerdings bei beier Hauptdatei davor was schreibe, werden nur seltsame Symbole angezeit, kein Bild mehr. Und wenn ich danach text schreibe wird nur das bild angezeigt und kein text.

      Mfg

      1. Yerf!

        Aber was muss ich jetzt machen, damit ich es in eine richtige html-seite einbinden kann?

        Das gleiche wie auch bei einem "normalen" Bild.

        Ich möchte z.B. Eine ÜBercschrift, dann das bild und am ende noch einen kleinen text. Wenn ich allerdings bei beier Hauptdatei davor was schreibe, werden nur seltsame Symbole angezeit, kein Bild mehr. Und wenn ich danach text schreibe wird nur das bild angezeigt und kein text.

        Klar, bei einem normalen Bild fügst du das HTML ja auch nicht in die Bilddatei ein, sondern schreibst eine 2. (HTML-)Datei in der ein IMG-Rlement per SRC auf das Bild verweist.

        Gruß,

        Harlequin

        --
        <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
        1. Hi,

          ok danke. Mit hilfe eurer 3 tipps und google hab ich es jetzt geschafft das bild in eine richtige datei einzubinden.

          Allerdings ergibt sich mir damit das nächste problem: Das bild liegt jetzt auf dem server, soll da aber wieder runter, damit da nicht hunderte von dateien liegen. Ich hab die funktion unlink() gefunden. die hab ich in eine weitere function in meiner klasse eingebaut und diese funktion dann nach <img src=test.png> aufgerufen. jetzt wird kein bild mehr angezeigt.

          1. echo $begrüßung;

            Mit hilfe eurer 3 tipps und google hab ich es jetzt geschafft das bild in eine richtige datei einzubinden.
            Das bild liegt jetzt auf dem server, soll da aber wieder runter, damit da nicht hunderte von dateien liegen. Ich hab die funktion unlink() gefunden. die hab ich in eine weitere function in meiner klasse eingebaut und diese funktion dann nach <img src=test.png> aufgerufen. jetzt wird kein bild mehr angezeigt.

            Das PHP-Script generiert ein Bild als Datei, ein <img>-Element und löscht anschließend die Datei. Nun liefert der Webserver das Ergebnis des PHP-Scripts aus. Der Browser findet darin ein <img>-Element und freut sich, ruft die Ressource auf und ... ärgert sich 404 Millisekunden lang.

            Wäre es vielleicht eine bessere Idee, das Bild erst beim Request nach ebenjenem zu erzeugen und direkt auszuliefern?

            echo "$verabschiedung $name";

            1. Hi,

              Das PHP-Script generiert ein Bild als Datei, ein <img>-Element und löscht anschließend die Datei. Nun liefert der Webserver das Ergebnis des PHP-Scripts aus. Der Browser findet darin ein <img>-Element und freut sich, ruft die Ressource auf und ... ärgert sich 404 Millisekunden lang.

              Ich sag ja - logisch Nachdenken koennte manchmal echt helfen.

              MfG ChrisB

              --
              „This is the author's opinion, not necessarily that of Starbucks.“
      2. echo $begrüßung;

        Aber was muss ich jetzt machen, damit ich es in eine richtige html-seite einbinden kann?

        Wie bettet man denn Grafiken in HTML ein? Fügt man einfach die Bilddaten ein oder etwa einen Verweis auf ein weiteres Dokument?

        echo "$verabschiedung $name";

      3. Hi,

        Aber was muss ich jetzt machen, damit ich es in eine richtige html-seite einbinden kann?

        Logisch nachdenken.

        Ich möchte z.B. Eine ÜBercschrift, dann das bild und am ende noch einen kleinen text. Wenn ich allerdings bei beier Hauptdatei davor was schreibe, werden nur seltsame Symbole angezeit, kein Bild mehr.

        Irgendwie scheint obiges bei den meisten Anfaengern zu fehlen, wenn's um die Bilderzeugung mittels PHP geht - mit diesem "Problem" kommen immer wieder Leute an.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“