Marvin Esse: Problem mit php und imagettftext?

Hallo,

ich baue mir gerade ein eigenes Captcha, zumindest versuche ich es. Zu Beginn habe ich mir einfach Text als Grafik ausgegeben über die Funktion imagestring. Das funktioniert auch fehlerfrei. Aber die Funktion imagettftext funktioniert nicht ich weiß nicht warum. Hat jemand eine Idee?

Hier das kurze Script, um die Grafik zu erzeugen:

$code=rand(1000,9999);
$_SESSION["code"]=$code;

$bg_path = "/images/backgrounds/";
$backgrounds = array(
	$bg_path . '45-degree-fabric.png',
	$bg_path . 'cloth-alike.png',
	$bg_path . 'grey-sandbag.png',
	$bg_path . 'kinda-jean.png',
	$bg_path . 'polyester-lite.png',
	$bg_path . 'stitched-wool.png',
	$bg_path . 'white-carbon.png',
	$bg_path . 'white-wave.png');

$background = $backgrounds[mt_rand(0, count($backgrounds) -1)];
$angle = mt_rand( 0, 10 ) * (mt_rand(0, 1) == 1 ? -1 : 1);
$font_size = 12;
$font = "/font/times_new_yorker.ttf";

$img = imagecreatefrompng($background);
$color = imagecolorallocate($img, 255, 255, 255);
//imagestring($img, 20, 30, 20,  $code, $color);
imagettftext($img, $font_size, $angle, 5, 5, $color, $font, $code);

header("Cache-Control: no-cache, must-revalidate");
header('Content-type: image/png');
imagepng($img);
imagedestroy($img);

  1. Aber die Funktion imagettftext funktioniert nicht

    was soll das denn für jemanden bedeuten, der nicht vor deinem Monitor sitzt?

  2. Tach!

    Aber die Funktion imagettftext funktioniert nicht ich weiß nicht warum. Hat jemand eine Idee?

    Funktioniert nicht, heißt konkret was?

    header('Content-type: image/png');
    imagepng($img);
    imagedestroy($img);
    

    Lass diesen Teil zunächst weg. Vielleicht möchte dir PHP ja mit einer Fehlermeldung etwas sagen, die der Browser nur nicht anzeigen kann, weil er ein Bild darzustellen versucht, was er nicht kann, weil darin der Text einer Fehlermeldung steckt.

    dedlfix.

    1. Hallo dedlfix,

      danke für den Tipp. Ich dachte erst, dass ich den nicht weglassen kann, da ich das Script ja innerhalb des Img-Tags aufrufe. Auf den Gedanken, das Script einfach mal selber aufzurufen, bin ich gar nicht gekommen. Dadurch konnte ich jetzt feststellen, dass die Pfadangaben beim Font offenbar immer absolut angegeben werden müssen. Also bspw.: "d:/www/font/times_new_yorker.ttf".

      Danke sehr für die Hilfe. Jetzt funktionierts.

      Marvin

      1. Tach!

        Ich dachte erst, dass ich den nicht weglassen kann, da ich das Script ja innerhalb des Img-Tags aufrufe.

        Am Ende kannst du das natürlich nicht mehr, aber für die Fehlersuche ist es nicht weiter relevant, was am Ende rauskommt, wenn das Problem bereits auf einen vorhergehenden Schritt zurückgeführt werden kann. Dann muss man erstmal schauen, was diese Funktionen auf dem Weg zum Ziel alles anstellen.

        Dadurch konnte ich jetzt feststellen, dass die Pfadangaben beim Font offenbar immer absolut angegeben werden müssen. Also bspw.: "d:/www/font/times_new_yorker.ttf".

        Das glaub ich gar nicht mal, eine relative Adressiereung muss auch ausreichen. Die muss aber vom Arbeitsverzeichnis ausgehen, das nicht unbedingt das Script-Verzeichnis ist, vor allem, wenn es sich um ein inkludiertes aus einem Unterverzeichnis handelt. Das Arbeitsverzeichnis ist - solange nicht händisch umgestellt - immer das Verzeichnis, in dem das Script liegt, das für den konkreten Request gestartet wurde.

        Ein Script, das ein Bild erzeugt, ist dabei ebenfalls ein eigenständiger Request. Dass das aufgrund eines img-Elements in einem anderen Document ausgelöst wird, das vielleicht in einem anderen Verzeichnis liegt, spielt dabei keine Rolle.

        Nachtrag: Im Zweifelsfall kann man sich das Arbeitsverzeichnis mit getcwd() anzeigen lassen.

        dedlfix.