Picco: Zeichnen und aufrufen

Zeichenbereich(erstellen und speichern der Grafik)

  
class zeichengui{  
	function zeichenguiCreate($destf, $src0s, $src1s, $src2s) {  
		//tu ganz viel  
		imagedestroy($dest);//alles wieder leeren  
		return $farbe;//was hab ich eigentlich gezeichnet?  
	}  
//mehr funktionen  

zeichentest(Ausgabe und Aufruf)

  
include("zeichengui.php");  
$start=new zeichengui();  
$nnn = $start->zeichenguiCreate(werte);  
var_dump($nnn);  

so und hier ist auch schon das Problem

include ich die Datei kann ich die Funktionen aufrufen und meine Bilder generieren lassen aber ich kann nicht den Rückgabe wert ausgeben lassen und keine weiten Dinge tun (wie z.B. die fertige Grafik mit Informationen anzeigen).
also wie muss meine Testdatei aussehen, damit ich auf die Funktionen zugreifen kann ohne, dass die Testdatei sich auch für eine Grafik hält(was beim include der Fall ist)?

freundliche grüße

  1. Hallo,

    isoliere vielleicht dein problem. mit dem include kann es nix zu tun haben. es macht keinen unterschied, ob du alle texte in eine datei schreibst oder in n Teile zerlegst und nacheinander includest.

    Gruß

    jobo

    1. Hallo,

      isoliere vielleicht dein problem. mit dem include kann es nix zu tun haben. es macht keinen unterschied, ob du alle texte in eine datei schreibst oder in n Teile zerlegst und nacheinander includest.

      Gruß

      jobo

      ja DAS ist ja das Problem. wenn ich das ganze include hält sich meine Testdatei für eine Grafik (wegen dem png Header der mit includiert wird) aber include ich es nicht sind natürlich auch die Funktionen nicht da. wie mache ich also einen Aufruf zu einer Funktion die ich nicht includieren darf?

      1. Hallo,

        ich glaube da ist ein grundsätzliches problem, was du nicht geschildert hast. wie und wohin willst du es denn ausgeben? du kannst ggfs. deinen krempel als variable einfangen und dann ausechoen.

        $var = meineKlasse->gibMirMeinBild();
        echo $var;

        dass du includierst heißt ja nicht, dass die includierte datei gleich was ausgeben muss. wenn sie das macht, kannst du es auch ggfs. so einfangen (wenn das nicht programmiertechnisch murx wird):

        ob_start();

        include("meineBildOutput.php");

        $output = ob_get_contents();

        Gruß

        jobo

        1. ob_start:
          "[...] (mit Ausnahme von Headerinformationen)[...]"

          in meiner Zeichendatei wird ein PNG erstellt(zumindest wenn ich eine der Funktionen aufrufe)

          	header('Content-Type: image/png');  
          	imagepng($destft,$destf.'');
          

          dann muss natürlich auch ein Header für das PNG ausgegeben werden(wenn ich mich nicht ganz irre) und der Header macht mir die Probleme denn weil ich das ganze includiere bekommt natürlich auch die Testdatei den PNG Header und in einem PNG kann man eben kein HTML ausgeben. Ist verständlich was ich meine?

          1. Hallo,

            ob_start:
            "[...] (mit Ausnahme von Headerinformationen)[...]"

            in meiner Zeichendatei wird ein PNG erstellt(zumindest wenn ich eine der Funktionen aufrufe)

            header('Content-Type: image/png');  
            

            imagepng($destft,$destf.'');

            
            > dann muss natürlich auch ein Header für das PNG ausgegeben werden(wenn ich mich nicht ganz irre) und der Header macht mir die Probleme denn weil ich das ganze includiere bekommt natürlich auch die Testdatei den PNG Header und in einem PNG kann man eben kein HTML ausgeben. Ist verständlich was ich meine?  
              
            Nein, nicht wirklich. Den header gibst du doch an der Stelle aus, wo Du das bestimmst.  
              
            Da gibt es auch Haufenweise Anleitungen:  
              
            <http://www.php-kurs.com/grafiken-erstellen-mit-php.htm>  
              
            ... die erste, die mir mit "php grafik erstellen" untergekommen ist.  
              
            Gruß  
              
            jobo
            
            1. Nein, nicht wirklich. Den header gibst du doch an der Stelle aus, wo Du das bestimmst.

              ok offensichtlich reden wir aneinander vorbei.

              also

              • eine Datei mit Funktionen soll auf unterschiedliche weisen pngs generieren
              • welche weise und mit welchen Parametern möchte ich von einer anderen Datei aus mitteilen
              • von dieser 2. Datei aus soll dann die gespeicherte Grafik eingeblendet werden, deren Pfad ich kenne. zusammen mit den Rückgabewerten aus den Funktionen aus der ersten Datei

              was passiert:

              • werte werden übergeben
              • Grafik wird erstellt
              • Rückgabewerte und andere Dinge können in der Testdatei nun nicht mehr dargestellt werden, weil auch die Testdatei den Header vom erstellen der Grafik abbekommen hat.
          2. Hi!

            dann muss natürlich auch ein Header für das PNG ausgegeben werden(wenn ich mich nicht ganz irre) und der Header macht mir die Probleme denn weil ich das ganze includiere bekommt natürlich auch die Testdatei den PNG Header und in einem PNG kann man eben kein HTML ausgeben. Ist verständlich was ich meine?

            Nicht wirklich, weil du dein Beispiel nicht nachvollziehbar gestaltest, so kann man nur raten, dass es am Standardfehler liegt, den Anfänger gern machen: HTML und das Bild in einem Request erledigen zu wollen. Das geht so aber nicht. HTML bindet lediglich mit dem img-Element einen Verweis auf eine weitere Ressource ein. Diese Ressource muss dann das Bild liefern und nichts weiter.

            Lo!

            1. Hi!

              dann muss natürlich auch ein Header für das PNG ausgegeben werden(wenn ich mich nicht ganz irre) und der Header macht mir die Probleme denn weil ich das ganze includiere bekommt natürlich auch die Testdatei den PNG Header und in einem PNG kann man eben kein HTML ausgeben. Ist verständlich was ich meine?

              Nicht wirklich, weil du dein Beispiel nicht nachvollziehbar gestaltest, so kann man nur raten, dass es am Standardfehler liegt, den Anfänger gern machen: HTML und das Bild in einem Request erledigen zu wollen. Das geht so aber nicht. HTML bindet lediglich mit dem img-Element einen Verweis auf eine weitere Ressource ein. Diese Ressource muss dann das Bild liefern und nichts weiter.

              Lo!

              also das bild wird in den ordner img gespiechert den pfad und auch den datei namen kenne ich und das ist auch nur ein bild und sonst nichts.
              ich würde das bild gerne in den ornder img erstellen lassen(so wie jetzt) und dann die rückgabe werte aus der erstellenden funktion haben damit ich damit weiter arbeiten kann aber das bekomme ich nicht hin.

              <?php  
              class zeichengui{  
              	function zeichenguiCreate($destf, $src0s, $src1s, $src2s) {  
              	//lege werte fest und gib sie zurück  
              		$this->zeichenguiCreateFinal($destf, $src0s, $src0, $src1, $src2, $dest, $dest1, $dest2, $dest3, $dest4, $dest5);  
              		  
              	imagedestroy($dest);  
              	return $farbe;  
              	}  
              	  
              	function zeichenguiCreateSpecial($destf, $src0s, $src1s, $src2s, $dests, $dest1s, $dest2s, $dest3s, $dest4s, $dest5s) {  
              	// lege werte fest2  
              		  
              		$this->zeichenguiCreateFinal($destf, $src0s, $src0, $src1, $src2, $dest, $dest1, $dest2, $dest3, $dest4, $dest5);  
              			  
              		  
              	imagedestroy($dest);  
              	}  
              	function zeichenguiCreateFinal($destf, $src0s, $src0, $src1, $src2, $dest, $dest1, $dest2, $dest3, $dest4, $dest5){  
              	//erstellen  
                
              	// Output and free from memory  
              	header('Content-Type: image/png');  
              	imagepng($destft,$destf.'');  
              	//imagejpeg($dest,"./img/testen.jpg");  
                
              	imagedestroy($dest);  
              	}  
              }  
              ?>
              
              include("zeichengui.php");  
              	$start=new zeichengui();  
              		$nnn = $start->zeichenguiCreate(werte);  
              	var_dump($nnn);  
              echo '<img src="mein pfad" />';  
              
              
              1. Hi!

                also das bild wird in den ordner img gespiechert

                Warum willst du das Bild speichern? Wolltest du es nicht auf Anforderung hin erzeugen, ausgeben und gleich wieder vergessen?

                Wenn du es speicherst, brauchst du keinen Content-Type-Header für ein Bild auszugeben, denn die Bilddaten gelangen ja nicht in die Ausgabe sondern in die Datei. Diese wird dann vielleicht von einem anderen Request angefordert. Der Apache ist so konfiguriert, dass er anhand der Dateiendung selbständig den korrekten Content-Type-Header sendet.

                Es ist allerdings sehr ungünstig, eine Datei anzulegen, denn im Web können viele Anwender gleichzeitig den Server befragen, was dann zu Problemen mit der gleichzeitigen Erzeugung durch verschiedene Prozesse/Requests führen kann. Wenn das Bild für jeden Request neu generiert werden soll, ist es deshalb günstiger, es on-the-fly zu erzeugen. Das muss dann aber in dem Request passieren, der die Bildresource haben will, also das was von <img src=...> ausgelöst wird.

                function zeichenguiCreateFinal($destf, $src0s, $src0, $src1, $src2, $dest, $dest1, $dest2, $dest3, $dest4, $dest5){  
                

                //erstellen

                // Output and free from memory
                header('Content-Type: image/png');
                imagepng($destft,$destf.'');
                //imagejpeg($dest,"./img/testen.jpg");

                imagedestroy($dest);
                }
                }
                ?>

                
                >   
                > ~~~php
                
                include("zeichengui.php");  
                
                > 	$start=new zeichengui();  
                > 		$nnn = $start->zeichenguiCreate(werte);  
                > 	var_dump($nnn);  
                > echo '<img src="mein pfad" />';  
                > 
                
                

                Genau so geht es eben nicht. zeichenguiCreate() sendet via zeichenguiCreateFinal() einen Content-Type-Header für ein Bild. Der Content, den dein echo ausgibt ist aber HTML. Beides zusammen geht nicht in einem Request.

                Lo!

                1. Warum willst du das Bild speichern? Wolltest du es nicht auf Anforderung hin erzeugen, ausgeben und gleich wieder vergessen?

                  nein eigentlich nicht... oder besser gesagt nicht immer

                  Es ist allerdings sehr ungünstig, eine Datei anzulegen, denn im Web können viele Anwender gleichzeitig den Server befragen, was dann zu Problemen mit der gleichzeitigen Erzeugung durch verschiedene Prozesse/Requests führen kann. Wenn das Bild für jeden Request neu generiert werden soll, ist es deshalb günstiger, es on-the-fly zu erzeugen. Das muss dann aber in dem Request passieren, der die Bildresource haben will, also das was von <img src=...> ausgelöst wird.

                  ist es besser alle Grafiken (auch wenn manche einige zeit lang gleich bleiben) immer wieder neu aus werten zu generieren anstatt es einmal zu speichern und dann immer wieder aufzurufen bzw zu überspeichern?

                  und was wenn ich die werte nicht mit an src="img/grafik" ran hängen kann? also sprich src="img/grafik25369" ist in Ordnung aber src="img/grafik?user=25369" nicht was tue ich dann?

                  Genau so geht es eben nicht. zeichenguiCreate() sendet via zeichenguiCreateFinal() einen Content-Type-Header für ein Bild. Der Content, den dein echo ausgibt ist aber HTML. Beides zusammen geht nicht in einem Request.

                  ja und deswegen frage ich wie ich das Ergebnis erreichen kann. ginge es mit meiner Variante müsste ich nicht um Hilfe fragen ;-)

                  1. Hi!

                    ist es besser alle Grafiken (auch wenn manche einige zeit lang gleich bleiben) immer wieder neu aus werten zu generieren anstatt es einmal zu speichern und dann immer wieder aufzurufen bzw zu überspeichern?

                    Nein, aber dann musst du noch etwas mehr Aufwand treiben. Günstig ist, wenn der Apache die fertige Datei ausliefern kann, was jedoch etwas voraussetzt, das im Falle eines Nicht-Vorhandensein das PHP-Script aufruft. Sowas könnte man mit mod_rewrite erledigen: eine Rule, die den Grafik-Dateinamen auf den vom Grafik-Script umschreibt und davor eine RewriteCond, die bei real existierenden Dateien die Rule unwirksam werden lässt.

                    und was wenn ich die werte nicht mit an src="img/grafik" ran hängen kann? also sprich src="img/grafik25369" ist in Ordnung aber src="img/grafik?user=25369" nicht was tue ich dann?

                    Dann bleibt dir wohl nur, eine Session zu eröffnen, die Werte dort abzulegen und vom Grafikscript auszulesen. Damit hast du alle Besonderheiten einer Session zu beachten, wie Clients, die keine Cookies mögen beispielsweise. Auch kann es vorkommen, dass das Grafikscript aufgerufen wird, ohne dass eine Session existiert.

                    Genau so geht es eben nicht. zeichenguiCreate() sendet via zeichenguiCreateFinal() einen Content-Type-Header für ein Bild. Der Content, den dein echo ausgibt ist aber HTML. Beides zusammen geht nicht in einem Request.
                    ja und deswegen frage ich wie ich das Ergebnis erreichen kann. ginge es mit meiner Variante müsste ich nicht um Hilfe fragen ;-)

                    Schon klar, dann musst du aber auch zu verstehen versuchen, was dir geantwortet wird. Denn dass du das nicht in einem Request machen kannst, hatte ich dir ja schon gesagt, was du jedoch anscheinend nicht richtig wahrgenommen hast. Aber das macht nichts, wir sind ja jetzt auf einem guten Weg.

                    Lo!

                    1. das mit dem "nicht in einem Request" habe ich wahrgenommen aber was ist die richtige Lösung?

                      ohne header geht es jetzt (hab hier und da noch etwas rumgeschraubt)

                      danke

                      1. Hi!

                        das mit dem "nicht in einem Request" habe ich wahrgenommen aber was ist die richtige Lösung?

                        Zwei Requests - das HTML-Dokument und die Grafik. Dass du dich nicht auf diese Reihenfolge verlassen kannst, schrieb ich ja schon. Auch einen Vorschlag, wie die Grafik nicht jedes Mal neu erstellt werden muss, machte ich. Wenn dir die Apache-Lösung nicht zusagt, kannst du auch ein Grafik-Script schreiben, das entweder die Datei erzeugt, sie ablegt und dann ausliefert, oder, wenn sie bereits existiert, sie nur ausliefert.

                        Lo!

  2. Hallo Picco,

    zeichentest(Ausgabe und Aufruf)

    include("zeichengui.php");
    $start=new zeichengui();
    $nnn = $start->zeichenguiCreate(werte);
    var_dump($nnn);

    Was gibt der var\_dump aus? Inwiefern ist das anders, als du erwartest? Anders gefragt: Was passiert genau und was hättest du erwartet?  
      
    ciao  
    romy
    
    -- 
    [Piraten ahoi](http://www.piratenpartei.de/navigation/politik/unsere-ziele)
    
    1. Hallo Picco,

      zeichentest(Ausgabe und Aufruf)

      include("zeichengui.php");
      $start=new zeichengui();
      $nnn = $start->zeichenguiCreate(werte);
      var_dump($nnn);

      
      > Was gibt der var\_dump aus? Inwiefern ist das anders, als du erwartest? Anders gefragt: Was passiert genau und was hättest du erwartet?  
      >   
      > ciao  
      > romy  
        
      es wird eine Grafik (genauer gesagt ein png) mit dem Text:  
      Die Grafik kann nicht angezeigt werden weil sie Fehler enthält.  
        
      die ist der Fall weil ich die Grafik speichere und nicht ausgebe. entferne ich den speicherpfrad der Grafik wird in der Testdatei nur das Bild angezeigt.  
        
      eigentlich will ich in Testdatei nur den Rückgabewert der aufgerufenen Funktion sonst nichts ... und natürlich den Aufruf zum generieren der Grafik starten.