Matthias: Bilderzeugung mit PHP & GD-Lib

Guten morgen liebe User!

Ich habe ein Problem mit dynamischer Bilderzeugung in PHP. Der User kann ein Template (Muster) durch ein Formular auswählen und den dazugehörigen Text in ein weiteres Feld eintippen. Anschließend wird in einem Fenster eine Vorschau erzeugt - mit Hilfe von PHP & der GD-Library. Ich habe bereits diverse Male versucht Text in einem Bild mit einer Breite von 400px zu zentrieren, aber leider scheint es dafür keine definierte Funktion zu geben?

Heist das nun für uns, wir müssen berechnen wie breit der Textrahmen ist , dies dann mit der Breite des Bild berechnen und dann im Bild platzieren? Was macht man dann wenn es sich um mehrere Textzeilen handelt? Kann man / Muss man pro Zeile dies dann splitten und erneut berechnen lassen?

Sonnige Grüße aus dem ach so kalten und verregneten Stuttgart,

Matthias P.

  1. Moin!

    Ich habe bereits diverse Male versucht Text in einem Bild mit einer Breite von 400px zu zentrieren, aber leider scheint es dafür keine definierte Funktion zu geben?

    Richtig. Die Funktion zum Schreiben von TTF-Font-Text nimmt die Koordinaten des Textbeginns entgegen - wenn der Text zentriert sein soll, mußt du einfach "passende" Koordinaten angeben.

    Es gibt ja aber auch eine Funktion, die dir die Abmessungen der entstehenden Textbox zurückliefert, ohne Text in die Grafik zu malen. Zentrieren ist damit nur ein klein wenig Rechenarbeit - verbunden mit den notwendigen Überlegungen für den Fall, dass der Text zu breit wird. :)

    Heist das nun für uns, wir müssen berechnen wie breit der Textrahmen ist , dies dann mit der Breite des Bild berechnen und dann im Bild platzieren? Was macht man dann wenn es sich um mehrere Textzeilen handelt? Kann man / Muss man pro Zeile dies dann splitten und erneut berechnen lassen?

    Mehrere Zeilen zu zentrieren bedeutet in der Tat, diese einzeln zu platzieren.

    Aber wenn du diese Aufgabe erst einmal in eine Funktion gebracht hast, ist das ja ein nicht mehr so kompliziertes Problem, oder? :)

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Aber wenn du diese Aufgabe erst einmal in eine Funktion gebracht hast, ist das ja ein nicht mehr so kompliziertes Problem, oder? :)

      • Sven Rautenberg

      Danke für die Antwort, das habe ich mir schon fast gedacht! Jetzt stellt sich nur noch das Problem der zugehörigen Rechenaufgabe...

      Greetz Matthias P.

      1. Moin!

        Danke für die Antwort, das habe ich mir schon fast gedacht! Jetzt stellt sich nur noch das Problem der zugehörigen Rechenaufgabe...

        Das ist doch relativ simpel:

        Angenommen, dein Bild ist 400 Pixel breit, und dein Text ist 300 Pixel breit. Dann hast du noch 100 Pixel Platz übrig. Wie ist dieser Platz aufzuteilen, damit links und rechts der gleiche Platz bleibt, um einen "zentriert"-Eindruck zu gewinnen?

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. Das ist doch relativ simpel:

          Angenommen, dein Bild ist 400 Pixel breit, und dein Text ist 300 Pixel breit. Dann hast du noch 100 Pixel Platz übrig. Wie ist dieser Platz aufzuteilen, damit links und rechts der gleiche Platz bleibt, um einen "zentriert"-Eindruck zu gewinnen?

          • Sven Rautenberg

          Hi,

          die Berechnung ist nicht das Problem. Das Problem ist eher das, wie ich das mache, dass der Text, der dann nicht mehr in die Textzeile passt, in eine andere Variable kommt usw.
          Oder wie sollte ich das Problem lösen?

          Grüße

          1. Hi,

            die Berechnung ist nicht das Problem. Das Problem ist eher das, wie ich das mache, dass der Text, der dann nicht mehr in die Textzeile passt, in eine andere Variable kommt usw.

            Sobald der Text eine bestimmte Breite überschreitet, zerschneidest du ihn. Ganz einfach.
            Die Holzhammermethode wär natürlich, das du schlicht eine Anzahl von Zeichen vorgibst, dann bist du aber abhängig davon, das sich die Schriftart / -grösse nicht ändert.

            1. Sobald der Text eine bestimmte Breite überschreitet, zerschneidest du ihn. Ganz einfach.

              Das ist leider das Problem, ich bräuchte einen Ansatz hierfür. Ich kann es mir gedanklich logisch vorstellen, aber die Umsetzung in PHP bringt mich zum grübeln...

              Danke!

              1. Hallo Matthias,

                Sobald der Text eine bestimmte Breite überschreitet, zerschneidest du ihn. Ganz einfach.
                Das ist leider das Problem, ich bräuchte einen Ansatz hierfür. Ich kann es mir gedanklich logisch vorstellen, aber die Umsetzung in PHP bringt mich zum grübeln...

                ich kann dir nur skizzieren, wie *ich* das anpacken würde:

                1. Den String an allen Leerzeichen aufsplitten, so dass du ein Array mit den einzelnen Wörtern hast
                2. Für jedes der Wörter mit der gewünschten Schriftart und -größe die Länge in Pixeln berechnen
                3. Beginnend beim ersten Wort die berechneten Längen aufaddieren, solange sie gerade noch in die vorgesehene Grafik passen, dabei für jedes Wort ein paar Pixel für das Leerzeichen addieren (oder vorher auch den Platzbedarf eines Blanks in der gewünschten Schrift berechnen)
                4. Die ermittelte Anzahl Wörter aus dem Array isolieren, wieder zu einem String zusammenklatschen und ins Bild schreiben
                5. Fall noch weitere Wörter übrig sind: Zurück zu Schritt 3.

                Das ist alles nur so ins Unreine gedacht, aber als Denkanstoß sollte es ausreichen, finde ich.

                So long,
                 Martin

                --
                Die Zeit, die man zur Fertigstellung eines Projekts wirklich braucht, ist immer mindestens doppelt so lang wie geplant.
                Wurde dieser Umstand bei der Planung bereits berücksichtigt, gilt das Prinzip der Rekursion.
  2. Hallo Matthias,

    Sonnige Grüße aus dem ach so kalten und verregneten Stuttgart,

    gegen sonnige Grüße aus der Nachbarschaft ist nichts einzuwenden - die Sonne vermisse ich auch schon seit Tagen, ach, Wochen!
    Aber wenn's bei dir auch noch regnet, dann kann das wohl nur lokal begrenzt sein. Etwa 30km NO ist es zwar auch recht frisch draußen (momentan knapp 10°C, für Anfang Juni entschieden zu kalt), aber es ist alles trocken. Genau genommen hat es hier schon lange nicht mehr geregnet - seit gestern mittag nicht mehr! ;-)

    Grüße aus Backnang,
     Martin

    --
    Realität ist eine Illusion, die durch Unterversorgung des Körpers mit Alkohol entstehen kann.
    1. Moin,

      Genau genommen hat es hier schon lange nicht mehr geregnet - seit gestern mittag nicht mehr! ;-)

      Das ist ja nix :-) Hier hat es schon seit Minuten nicht mehr geregnet :-)

      Gruß aus Kiel, 200 Meter Luftlinie von der Mess-Station des IFM-Geomar

      Swen Wacker