• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

zentrierten Text auf transparentem Hintergrund erzeugen

schlegel.berlin

New member
Hallo Leute,

hab gerade wieder mal eine kleine Denksportaufgabe, an deren Lösung ich irgendwie hänge...

Vor einiger Zeit habe ich mir ein vorhandenes Script für eigene Zwecke modifiziert, das, wenn ihr es euch anschaut, so hoffe ich, selbst erklärt.

Jetzt stehe ich vor der Aufgabe, einen zentrierten Text in einem bestimmtenm Winkel auf einem Hintergrund zu erzeugen, der allerdings transparent sein muss.

Hab schon einiges "ergoogelt" und auch probiert, hänge aber einfach fest. Irgendwie ist mein Hirn vernagelt (liegt vielleicht an meinen grippalen Infekt)...

Ich poste mal mein urspüngliches (kommentiertes) Script. Es wäre nett, wenn Ihr mir gründlich auf die Sprünge helfen würdet :)

Vielen Dank schon mal im Voraus und liebe Grüße, Karin

PHP:
   // Variablen (Text, Hintergrundbildfarbe, Hintergrundbildgröße, Textfarbe, Textgröße, Textwinkel)
    $font = "BRUSHSCI.TTF";
    $text_farbe = "202020";
    $bild_farbe = "D5CDBB";//Hintergrund
    $bild_hoehe = 45;// in Pixel
    $bild_breite = 700;// in Pixel
    $text = "Hier steht ein Text ...";
    $size = 28;
    $angle = 0;

    // Bild erzeugen - Farbe und Größe (DIESES BILD MUSS NUN TRANSPARENT SEIN)

    $image = imagecreatetruecolor($bild_breite, $bild_hoehe);
    imagefill($image, 0, 0, hexdec($bild_farbe));


    // Ein Kreuz als Hilfslinien zur leichteren Orientierung auf dem Bild erzeugen,
	// falls die Schift nicht exakt horizontal oder vertikal sein soll,
	// in schwarz, siehe hexwerte

	   
    //imageline($image, 0, 0, imagesx($image), imagesy($image), hexdec("000000"));
    //imageline($image, imagesx($image), 0, 0, imagesy($image), hexdec("000000"));

    $bbox = imagettfbbox_fixed($size, $angle, $font, $text);

    // Text erzeugen und zentrieren
    // imagettftext() Bezugspunkt ist links unten 
    imagettftext($image, $size, $angle, imagesx($image) / 2 - $bbox['width'] / 2, imagesy($image) / 2 + $bbox['height'] / 2, hexdec($text_farbe), $font, $text);

    // Bild ausgeben
    imagepng($image);

    function imagettfbbox_fixed($size, $angle, $font, $text)
    {
        // Bildgröße der Textbox
        $bbox = imagettfbbox($size, 0, $font, $text);

        // Textbox drehen
        $angle = pi() * 2 - $angle * pi() * 2 / 360;
        for ($i=0; $i<4; $i++)
        {
            $x = $bbox[$i * 2];
            $y = $bbox[$i * 2 + 1];
            $bbox[$i * 2] = cos($angle) * $x - sin($angle) * $y;
            $bbox[$i * 2 + 1] = sin($angle) * $x + cos($angle) * $y;
        }

        // Textbox
        $bbox['width'] = $bbox[0] + $bbox[4];
        $bbox['height'] = $bbox[1] - $bbox[5];

        return $bbox;
    }
 
Zuletzt bearbeitet:
Hallo Leute,

hatte seit meinem Post keine Zeit mehr, mich um das "Problem" zu kümmern. Erst seit 15 Minuten wieder.
Hatte ien Idee, die grundsätzlich auch funktioniert,allerdings mit einer Einschränkung.

Ich erzeuge jetzt keinen Hintergrund mehr mit:
PHP:
$image = imagecreatetruecolor($bild_breite, $bild_hoehe);
sondern nehme stattdessen einfach ein Hintergrundbild:
PHP:
$image = 	ImageCreateFromPNG('_test.png');

Funzt auch. Aber sobald ich '_test.png' transparent mache, verschwindet auch der Text. Weshalb ist das so?

Liebe Grüße, Karin
 
Ich will dich nicht hängen lassen aber von PHP habe ich keine Ahnung.
Es sind auch sonst scheinbar alle in Urlaub.
Vielleicht auch mal in einem PHP Forum fragen, wenn es eilig für dich ist.
 
Hi mikdoe,
nett, dass Du Dich trotzdem meldest (trotzdem weil Du nicht der PHP-Spezi bist, wie Du selbst schreibst...)
Nein, ist nicht eilig, ich las mir (oder besser, jenen, die noch im wohl verdienten Urlaub sind) einfach noch ein bisschen Zeit ..

LG, Karin
 
Probier mal folgenden Schnipsel:
PHP:
$img = imagecreate (300 , 100);
$bg = ImageColorAllocate ($img, 255, 255, 255);
//folgende Zeile zum Test auch mal auskommentieren
ImageColorTransparent($img, $bg);

$text_farbe = ImageColorAllocate($img,0, 0, 0); 
ImageString ($img, 5, 100, 40, 'text', $text_farbe);
ImagePNG ($img,'tmpimg.png');
//
$html = '<body style="BACKGROUND: yellow">';
$html .= '<img src="tmpimg.png"></img>';
$html .= '</body>';
echo $html;

Ich hoffe, es hilft.

LG jspit

edit:
Vielleicht auch mal in einem PHP Forum fragen, wenn es eilig für dich ist.

Auch wenn es nicht eilig ist, halte ich das nicht für die schlechteste Idee..
 
Zuletzt bearbeitet:
Hallo jspit,

erst mal lieben Dank.
hat nur den "Haken", dass der Text NICHT (automatisch) zentriert auf dem image sitzt.
Das muss er aber und zwar in Abhängigkeit seiner sich ändernden Textlänge (zwischen 3 und 33 Zeichen).

Das Zentrieren erledigt in meinem Script nachstehender Code-Schnipsel (bbox definiert dabei die "Länge" des Textes und imagettftext zentriert bbox auf dem Hintergund):

PHP:
.
.
.
$bbox = imagettfbbox_fixed($size, $angle, $font, $text); 
/* siehe function imagettfbbox_fixed($size, $angle, $font, $text) im anfänglich geposteten Script */

imagettftext($image, $size, $angle, imagesx($image) / 2 - $bbox['width'] / 2, imagesy($image) / 2 + $bbox['height'] / 2, hexdec($text_farbe), $font, $text); 
.
.
.

Fällt dDir dazu etwas ein?

LG, Karin
Mein ursprünglich gepostetes Script erzeugt das in der Anlage begefügte Image
 

Anhänge

  • image.png
    image.png
    5,1 KB · Aufrufe: 3
Zuletzt bearbeitet:
Ich hab das so gelesen daß ein transparenter Hintergrund das Hauptproblem ist und nicht das Zentrieren. Ich vermisse bei dir ImageColorTransparent, ...
Muss ich mir morgen mal anschauen.
 
Ja, "ImageColorTransparent" vermisse ich auch, lach ...
Die Frage ist (meine Frage), wie setz ich dieses Attribut in meinem Script ein. Genau das bekomme ich einfach nicht hin :-((

LG, Karin

Ich hab das so gelesen daß ein transparenter Hintergrund das Hauptproblem ist und nicht das Zentrieren. Ich vermisse bei dir ImageColorTransparent, ...
Muss ich mir morgen mal anschauen.
 
Hi Karin,
das ImageColorTransparent einzufügen kann doch nicht das Problem sein:
PHP:
//  :
    $image = imagecreatetruecolor($bild_breite, $bild_hoehe);
    $bild_farbe = imagecolorallocate($image, 0xD5, 0xCD, 0xBB);

    ImageColorTransparent($image, $bild_farbe);

    imagefill($image, 0, 0, $bild_farbe);

// :

Die Bildfarbe weise ich immer mit imagecolorallocate zu und nicht mit hexdec(..). Wenn du ein Bild als Basis nimmst, bekommst du u.U. Probleme eine geeignete Farbe für die Transparenz zu finden.

LG jspit
 
:confused:
Wie blöd bin ich eigentlich?
Es geht zwar auch mit "Hexdex", aber Du hast natürlich Recht, "imagecolorallocate" ist eindeutig besser.

Das war ja auch garnicht das Problem. Das Problem war meine eigene "Blödheit".
Hätte ich meinen "Trasparenzversuch" auch gepostet und nicht nur das "Basisscript", dann wäre es Dir sicher sofort aufgefallen.
Ich hatte schlicht die Bildfarbe eine Zeile NACH "ImageColorTransparent" definiert. Das kann ja nicht funktionieren. Hab sicher 100 mal über das Script gelesen und meinen dämlichen Fehler nicht bemerkt ...

Bemerkt hab ich es letztlich dadurch, dass ich Deine geposteten Zeilen einfach in mein Zeug eingefügt habe, in dem Glauben, dass sei ja auch nicht anders als das, was ich schon hatte. Und siehe das, es funzte plötzlich. Also, Änderung zurück und da springt mir der Teufel in's Auge, hmmmm ...
Da zeigt sich: Wr schreiben und lesen kann ist klar im Vorteil - und, Gründlichkeit geht auch hier mal wieder vor Schnelligkeit ...
puhhh :-((((

Lieben Dank für Dein Hilfe, LG Karin
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben