Schriftendarstellung mit GD und TTF funktioniert nicht richtig!

preko

Erfahrenes Mitglied
Hi,

ich habe folgende Codezeilen, die einen Text mit der TTF Schriftart "verdanab" darstellen sollen:
PHP:
<?php
header("Content-type: image/png");

$bild = ImageCreate(100,50);

$hintergrund = imagecolorallocate($bild, 255, 255, 255);
$farbeSchwarz = imagecolorallocate ($bild, 0, 0, 0);

ImageTTFText($bild, 20, 0, 10, 50, $farbeSchwarz, 'images/verdanab . ttf', "TEST");

imagepng($bild);
imagedestroy($bild); 
?>

Ich habe die Fontbezeichnung bewußt mit einem Leerzeichen vor und nach dem Punkt geeschrieben, da sonst das Forum das ganze zu "verdanabf" verhunzen würde. Im Originalscript sind keine Leerzeichen vorhanden! ;)

Nun zum Problem an sich:
das Script an sich funktioniert, wenn diese Codezeilen am Anfang der Webseite stehen. Dann wird auch der Schriftzug dargestellt, allerdings nicht mehr der Rest der Seite.

Wenn ich nun die Codezeilen in die Mitte der Seite setze, wo sie auch erscheinen sollen, kommt dann logischerweise die Meldung in etwa:
Header allready send...

Wie kriege ich es nun hin, dass das Script die Codezeilen dort verarbeitet und anzeigt, wo sie benötigt werden, ohne die "Header allready send..."-Fehlermeldung? :confused:


Beste Grüße,
preko


P.S.: Habe im Forum gesucht, aber nichts passendes gefunden. ;)
 
Also eine Lösung wäre, den Quelltext in eine separate Datei zu schreiben und ihn dann per [phpf]include[/phpf]-Funktion oder mit einem img-Tag an die richtige Stelle zu setzen.

greetz
daddz
 
Hi,

wie verarbeite ich per IMG-Tag ein generiertes Bild?

Die normale Anwendung ist klar (<img src="muster.jpg">), jedoch auf was verweise ich bei einem generierte Bild? Dort habe ich doch eigentlich "nur" einen String, oder?

Bekomme ich bei der include() Funktion nicht auch das Problem, dass die Meldung kommt "Header allready send..."?


Beste Grüße,
preko
 
Wenn ich die Codezeilen include(), dann bekomme ich auch die Meldung "Warning: Cannot modify header information - headers already sent by...".

Wenn ich auf das "Bild" mit einem IMG-Tag verweise, dann wird zwar die Grafik dargestellt, es kommt aber auch die Darstellung (an der Stelle, wo die entsprechenden Verweis-Codezeile stehen):
‰PNG  IHDRªK@–PLTEÿÿÿ¿¿¿___ßßß?ŸŸŸ?Ž?+ÓIDATxœí•¿nÂ0ÆÚŒ9 ?±¼H}€t`'RÕ™¼‘Pç"U}îÞ‡œ“ÆSÇû,ìû~¶ÏgÇ9“Éd2™L&“‰•àïàà\öÓÀÇÍ÷^°¡1ð*ð+ÝʤG'ÔTø{ä€/éÝM©6›Ð¥¶p¦(VYs/Ôj2™2Ũ)¡²ÆGœ…z™P—4ghŠQ;XQT·ì`-ÔP9bÚ“ÿ%0©Ñ1Ó~uî?OŒ’[3ê1õ•Ä ¦õÄÙºËî–t^ ””‚µ? çG™"Ô–ÐÒž?{&\+JAHőуÓ<5å²¢•P“Ñr((!õ ÷Üqì`š§v²È~”Z¤b&.!Oáµ6ÍS¥DÇT<?mH½cu¤|KÓ<µ”{8ÊžxR,¥E_ÎÞ4O}•žVA¨ _ð+mš§b=Sm‡•U> ¦žºÖ¦ãßÇ· àJS—žZjS„Š«Æ7¶ài4µëïüU™bÔ=…>^—wOÍCjˉL%í½)FÍù ‚—?"MÍ8†Îl£M*®£tý«-ÏEî55—'§Ú¦õ4|a¾ÝƒšjêR¾\*Úô'Õd2™L&“éŸõ ”àUs?•iïIEND®B`‚
Ohne die Textliche Verwerfung wäre es natürlich gut. Warum gibt er zwar die Grafik aus, aber auch den o. g. Text? :confused:

Beste Grüße,
preko
 
Also bei mir funktioniert es einwandfrei.
Das ist meine bild.html:
HTML:
<html>
<head>
	<title>Bild-Test</title>
</head>
<body>
	<div>
		<p>Bild-Test Beginn</p>
		<img src="bild.php" />
		<p>Bild-Test Ende</p>
	</div>
</body>
</html>
Und das ist die bild.php:
PHP:
<?php
header("Content-type: image/png");

$bild = ImageCreate(100,50);

$hintergrund = imagecolorallocate($bild, 255, 255, 255);
$farbeSchwarz = imagecolorallocate ($bild, 0, 0, 0);

ImageTTFText($bild, 20, 0, 10, 50, $farbeSchwarz, 'verdanab . ttf', "TEST"); //ohne Leerzeichen versteht sich

imagepng($bild);
imagedestroy($bild); 
?>
greetz
daddz
 
preko hat gesagt.:
Wie kriege ich es nun hin, dass das Script die Codezeilen dort verarbeitet und anzeigt, wo sie benötigt werden, ohne die "Header allready send..."-Fehlermeldung? :confused:

Diese Fehlermeldung bekommst Du, wenn Du diesen PHP Code in eine normale HTML einbaust. Der Header wird bereits durch das HTML <HEAD>...</HEAD> gesendet und dein PHP kommt dann im <BODY> Tag.

Dein PHP Header will dem Browser sagen, das nun ein Bild kommt, jedoch meinte deine HTML vorher schon das ein Text kommt.

Bau den Script in eine extra PHP und rufe das Bild mittels href auf? Sorry soweit bin ich heute noch nicht gekommen.

Tom
 
Zurück