QueenBitch: Mehrzeilige Bilder erstellen mit PHP

Hi,

so die nächste Baustelle: das Bild wird erstellt, nur bei mehrzeiligen fehlt der Text - nur der schwarze Hintergrund wird angezeigt.

$querytext = "SELECT in_zeile1 FROM spr_inhalt order by rand() limit 1";
		// Abfrage an Server senden
		 $query = $conn->query ($querytext);
		 while($row = mysqli_fetch_object($query)) {
			$bild_text = utf8_decode ($row->in_zeile1);
			
			// text in einzelne zeilen zerlegen
			$bild_zeilen = explode("<br />", $bild_text);
			foreach($bild_zeilen as $Nr=>$Text)
				{
				$textnr = 4;
				$textbreite = imagefontwidth($textnr) * strlen($Text);
				$texthoehe  = imagefontheight($textnr);
				$img = imagecreate($textbreite,$texthoehe);
				$bg = imagecolorallocate($img,0,20,0);
				$white = imagecolorallocate($img,255,255,255);	
				imagestring ($img, $textnr, 0, $Nr*20, $Text, $white);
				
				}
			
			
			header("Content-Type: image/gif");
			imagegif($img);
		 }

Danke,

Shadowcrow

--
Lächle, Du kannst sie nicht alle töten....
  1. Tach!

    so die nächste Baustelle: das Bild wird erstellt, nur bei mehrzeiligen fehlt der Text - nur der schwarze Hintergrund wird angezeigt.

    Erstmal das error_reporting auf E_ALL setzen und display_errors auf on, falls das noch nicht der Fall ist. Dann zum Aufspüren des Fehlers die header()- und die imagegif()-Zeile auskommentieren und das Script direkt aufrufen. Fall keine Fehler aufgezeigt werden, kannst du nun zumindest Debugausgaben einbauen, die du dir ansehen kannst.

    dedlfix.

    1. Erstmal das error_reporting auf E_ALL setzen und display_errors auf on, falls das noch nicht der Fall ist. Dann zum Aufspüren des Fehlers die header()- und die imagegif()-Zeile auskommentieren und das Script direkt aufrufen. Fall keine Fehler aufgezeigt werden, kannst du nun zumindest Debugausgaben einbauen, die du dir ansehen kannst.

      Hatte ich schonmal, kam damit auch nicht weiter....hatte mir mit print_r den inhalt des arrays anzeigen lassen:

      $bild_zeilen = explode("<br />", $bild_text);
      			foreach($bild_zeilen as $Nr=>$Text) {
      		}
      			
      print_r($bild_zeilen);
      

      ⇒Array ( [0] => Für wahre Freunde geh ich durch die Hölle, [1] => den anderen zeig ich gern den Weg dorthin. )

      nur verstehe ich nicht warum der Text nicht ins Bild geschrieben wird...

      --
      Lächle, Du kannst sie nicht alle töten....
      1. Tach!

        nur verstehe ich nicht warum der Text nicht ins Bild geschrieben wird...

        Der_Martin hat vermutlich schon deinen Fehler gefunden. Es gibt immer mal wieder solche Situationen, in denen man selbst auf den Code schauen kann wie man will und den Fehler nicht findet. Dann muss man systematisch vorgehen und sich alle Zwischenergebnisse anschauen, um zu sehen, was wirklich passiert. Bei einfachen Variableninhalten kann man sich diese ausgeben lassen. Mit Bildern ist das schon etwas schwieriger. Da kannst du dir beispielsweise nach jedem Bearbeitungsschritt das Ergebnis ausgeben lassen. Dann hättest du zumindest mal gesehen, dass der Text zumindest zwischenzeitlich ins Bild kommt. In einer Schleife ist das zwar nicht ganz so einfach, aber dann kann man zumindest die Zwischenschritt-Bilder in jeweils eine Datei mit eindeutig vergebenem Namen ausgeben lassen.

        dedlfix.

        1. Der_Martin hat vermutlich schon deinen Fehler gefunden. Es gibt immer mal wieder solche Situationen, in denen man selbst auf den Code schauen kann wie man will und den Fehler nicht findet. Dann muss man systematisch vorgehen und sich alle Zwischenergebnisse anschauen, um zu sehen, was wirklich passiert. Bei einfachen Variableninhalten kann man sich diese ausgeben lassen.

          Stimmt, Martin war da schon auf der richtigen Spur...

          Mit Bildern ist das schon etwas schwieriger. Da kannst du dir beispielsweise nach jedem Bearbeitungsschritt das Ergebnis ausgeben lassen. Dann hättest du zumindest mal gesehen, dass der Text zumindest zwischenzeitlich ins Bild kommt. In einer Schleife ist das zwar nicht ganz so einfach, aber dann kann man zumindest die Zwischenschritt-Bilder in jeweils eine Datei mit eindeutig vergebenem Namen ausgeben lassen.

          Hmmpf, ich habe schon einen Teilerfolg erungen, die erste Zeile wird jetzt angezeigt...Ich komm da gerade nicht mit der Logik klar (Hergott, ich bin eine Frau, was hab ich mit Logik zu schaffen zeter).

                                  $query = $conn->query ($querytext);
                                  while($row = mysqli_fetch_object($query)) {
          			$bild_text = utf8_decode ($row->in_zeile1);
          			// text in einzelne zeilen zerlegen
          			$bild_zeilen = explode("<br />", $bild_text);
          			$textnr = 4;
          			$texthoehe  = imagefontheight($textnr);
          			foreach($bild_zeilen as $Nr=>$Text)
          				{
          				$textbreite = imagefontwidth($textnr) * strlen($Text);
          				$img = imagecreate($textbreite,$texthoehe);
          				$bg = imagecolorallocate($img,0,20,0);
          				$white = imagecolorallocate($img,255,255,255);	
          				imagestring ($img, $textnr, 0, $Nr*20, $Text, $white);
          				imagegif($img);
          				}
          			header("Content-Type: image/gif");
          			 }
          

          Shadowcrow

          p.s. in einer 1/2 Stdt. ist Feierabend, dann will ich von PHP erstmal nichts mehr hören, zumindest bis morgen...

          --
          Lächle, Du kannst sie nicht alle töten....
          1. Tach!

            Hmmpf, ich habe schon einen Teilerfolg erungen, die erste Zeile wird jetzt angezeigt...Ich komm da gerade nicht mit der Logik klar (Hergott, ich bin eine Frau, was hab ich mit Logik zu schaffen zeter).

            Das kann ja sein, ich bin aber nicht der Hergott ;)

            			foreach($bild_zeilen as $Nr=>$Text)
            				{
            				$img = imagecreate($textbreite,$texthoehe);
            				imagegif($img);
            				}
            			header("Content-Type: image/gif");
            			 }
            

            Ich hab aus dem Code-Zitat mal ein paar unwichtige Zeilen rausgeworfen. Da läuft noch etwas grundlegend vom Lösungsansatz des eigentlichen Problems schief. Was ist denn die konkrete Aufgabenstellung überhaupt? Du erzeugst jedenfalls in einer Schleife mehrere Bilder und willst diese nacheinander an den Browser ausgeben. Das geht so mal gar nicht, weil je Request immer nur ein Dokument (1 Bild = 1 Dokument) ausgegeben werden kann. Vielleicht willst du das ja auch gar nicht, aber dann musst du mal die Frage nach der Aufgabenstellung beantworten.

            dedlfix.

            1. 			foreach($bild_zeilen as $Nr=>$Text)
              				{
              				$img = imagecreate($textbreite,$texthoehe);
              				imagegif($img);
              				}
              			header("Content-Type: image/gif");
              			 }
              

              Ich hab aus dem Code-Zitat mal ein paar unwichtige Zeilen rausgeworfen. Da läuft noch etwas grundlegend vom Lösungsansatz des eigentlichen Problems schief. Was ist denn die konkrete Aufgabenstellung überhaupt? Du erzeugst jedenfalls in einer Schleife mehrere Bilder und willst diese nacheinander an den Browser ausgeben. Das geht so mal gar nicht, weil je Request immer nur ein Dokument (1 Bild = 1 Dokument) ausgegeben werden kann. Vielleicht willst du das ja auch gar nicht, aber dann musst du mal die Frage nach der Aufgabenstellung beantworten.

              Ja, anscheinend habe ich mich etwas verfranst. Ich habe in einer DB Signatursprüche eingetragen und möchte immer einen (per Zufallsprinzip) als Bild ausgeben (sprich: bei jedem aufruf ein anderer Spruch) - Funktioniert. Einige enthalten HTML-Zeilenumbrüche, auch in dem Bild soll an dieser Stelle umgebrochen werden (Mehrzeiliger Text in einem Bild).

              Shadowcrow

              --
              Lächle, Du kannst sie nicht alle töten....
              1. Tach!

                Ich habe in einer DB Signatursprüche eingetragen und möchte immer einen (per Zufallsprinzip) als Bild ausgeben (sprich: bei jedem aufruf ein anderer Spruch) - Funktioniert. Einige enthalten HTML-Zeilenumbrüche, auch in dem Bild soll an dieser Stelle umgebrochen werden (Mehrzeiliger Text in einem Bild).

                Du meinst, dass pro Request ein Bild erzeugt und ausgegeben werden soll. Auf dieses Bild kommen die einzelnen Textzeilen aus der Datenbank?

                Da kann schon mal das erste while beim Abfragen des DBMS-Ergebnisses weg. Einfach Fetchen und ein einfaches if auf das Ergebnis, damit du den Fall abfangen kannst, dass gar kein Ergebnis kommt. Dann Bild erzeugen und in einer Schleife die Texte drauf pappen. Am Ende das Bild ausgeben (nach dem Header).

                dedlfix.

                1. ¡ollɐɥ

                  Du meinst, dass pro Request ein Bild erzeugt und ausgegeben werden soll. Auf dieses Bild kommen die einzelnen Textzeilen aus der Datenbank?

                  Ja

                  Da kann schon mal das erste while beim Abfragen des DBMS-Ergebnisses weg. Einfach Fetchen und ein einfaches if auf das Ergebnis, damit du den Fall abfangen kannst, dass gar kein Ergebnis kommt. Dann Bild erzeugen und in einer Schleife die Texte drauf pappen. Am Ende das Bild ausgeben (nach dem Header).

                  Mhhm, das schau ich mir Morgen an....bis denne

                  ʍoɹɔʍopɐɥs ƃl

                  --
                  Trau nie den leuchtenden Augen eines Mannes! Es könnte auch die Sonne sein, die durch seinen hohlen Kopf scheint!
                  1. Hallo QueenBitch,

                    ¡ollɐɥ
                    ʍoɹɔʍopɐɥs

                    Das kommt mir so bekannt vor …

                    Bis demnächst
                    Matthias

                    --
                    Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
                    1. ¡ollɐɥ

                      ¡ollɐɥ
                      ʍoɹɔʍopɐɥs

                      Das kommt mir so bekannt vor …

                      Yep, the one and only Übelkrähe ...

                      ƃl ʍoɹɔʍopɐɥs

                      --
                      Lächle, Du kannst sie nicht alle töten....
                      1. Hallo QueenBitch,

                        Yep, the one and only Übelkrähe ...

                        Möchtest du dann nicht deinen alten Account wiederhaben?

                        Bis demnächst
                        Matthias

                        --
                        Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
                        1. ¡ollɐɥ

                          Möchtest du dann nicht deinen alten Account wiederhaben?

                          Kennwort vergessen und keine Ahnung welche Mail Adresse ich verwendet habe.

                          ƃl ʍoɹɔʍopɐɥs

                          --
                          Lächle, Du kannst sie nicht alle töten....
  2. Hallo,

    so die nächste Baustelle: das Bild wird erstellt, nur bei mehrzeiligen fehlt der Text - nur der schwarze Hintergrund wird angezeigt.

    			foreach($bild_zeilen as $Nr=>$Text)
    				{
    				$textnr = 4;
    				$textbreite = imagefontwidth($textnr) * strlen($Text);
    				$texthoehe  = imagefontheight($textnr);
    				$img = imagecreate($textbreite,$texthoehe);
    				$bg = imagecolorallocate($img,0,20,0);
    				$white = imagecolorallocate($img,255,255,255);	
    				imagestring ($img, $textnr, 0, $Nr*20, $Text, $white);
    				}
    			header("Content-Type: image/gif");
    			imagegif($img);
    

    wenn ich die foreach-Schleife mal anschaue, fällt mir ein logischer Fehler auf: In jedem Schleifendurchlauf erzeugst du ein Bild, das genau die Maße der in diesem Durchlauf bearbeiteten Textzeile hat, dann schreibst du den Text hinein ... und wirfst es im nächsten Schleifendurchlauf wieder weg und erzeugst ein neues Bild.
    Nur nach dem letzten Durchlauf gibst du das erzeugte Bild aus.

    Solltest du nicht lieber vor der Schleife die Bildgröße anhand der Anzahl der Zeilen und der Länge der längsten Zeile bestimmen und das image-Objekt erzeugen? Und dann in der Schleife nur die einzelnen Zeilen mit dem passenden y-Offset ins Bild schreiben?

    So long,
     Martin

  3. @@QueenBitch

    Was soll das eigentlich werden? Textgrafiken? Mir scheint, dass du die falsche Technik einsetzt. Wäre nicht SVG statt GIF angebracht?

    LLAP 🖖

    --
    „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
    „Hat auf dem Forum herumgelungert …“
    (Wachen in Asterix 36: Der Papyrus des Cäsar)
    1. ¡ollɐɥ

      @@QueenBitch

      Was soll das eigentlich werden? Textgrafiken? Mir scheint, dass du die falsche Technik einsetzt. Wäre nicht SVG statt GIF angebracht?

      Hö? Ist nur ein Übungsprojekt, von SVG habe ich leider keinen Plan. Es geht nur um Signaturen (z.B. in Mails).

      ʍoɹɔʍopɐɥs ƃl

      --
      Lächle, Du kannst sie nicht alle töten....
      1. Hi,

        Es geht nur um Signaturen (z.B. in Mails).

        aber Mails sind Text. Dafür ein Bild zu erzeugen, um es dann als Attachment mitzuschicken, finde ich relativ ... ähm, am Sinn vorbei.

        ʍoɹɔʍopɐɥs

        Yea! Ich war schon irritiert, den Schriftzug im Startposting andersrum zu sehen! :-)
        Du hast dich hier lange nicht sehen lassen (oder wenn, dann nur inkognito).

        Ciao,
         Martin

        1. ¡ollɐɥ

          Es geht nur um Signaturen (z.B. in Mails).

          aber Mails sind Text. Dafür ein Bild zu erzeugen, um es dann als Attachment mitzuschicken, finde ich relativ ... ähm, am Sinn vorbei.

          nicht als Attachment sond eingebettet - und es war auch nur ein Beispiel. Ist nur eine Übung, das darf Sinnfrei sein.

          ʍoɹɔʍopɐɥs

          Yea! Ich war schon irritiert, den Schriftzug im Startposting andersrum zu sehen! :-)
          Du hast dich hier lange nicht sehen lassen (oder wenn, dann nur inkognito).

          Erwischt, ne war ne Zeit Offline, im RL verschollen.

          ƃl ʍoɹɔʍopɐɥs

          --
          Lächle, Du kannst sie nicht alle töten....