PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks. |
 |

25-02-2012, 16:46
|
DjDope
Registrierter Benutzer
|
|
Registriert seit: Feb 2012
Beiträge: 9
|
|
Fehler mit imagefttext
Hi,
ich hab ein Script das ich mir vor Jahren mal zusammengebastelt habe um Bilder mit Text zu versehen wieder rausrgekramt und wollte was anderes daraus machen, nun hab die ganzen Funktionen etc. die ich nicht mehr benötige ausgebaut und alles läuft noch 1a mit diesem Code, wenn ich dann aber mit imagefttext einen Text einfügen will wird mir das Bild nicht mehr angezeigt. Der imagefttext-Teil des Codes ist der Originale aus dem OriginalScript, sollte also eigentlich keine Probleme machen, tut er aber!
Hier der Code mit dem ich arbeite (der Fehler liegt sicher am imagefttext da es funktioniert wenn der imagefttext-teil weg ist)
PHP-Code:
header ("Content-type: image/png");
$ges = $_GET["ges"];
$pic = $_GET["pic"];
$text1 = $_GET["text1"];
$text2 = $_GET["text2"];
$gros = "12";
$gros2 = "10";
$font_file = "southpark.ttf";
$vorl = "$ges/$pic.png";
$Bild = ImageCreateFromPNG($vorl);
$black = imagecolorallocate($Bild, 0x00, 0x00, 0x00);
imagefttext($Bild, $gros, 0, 14, 125, $black, $font_file, $text1);
imagefttext($Bild, $gros2, 0, 44, 125, $black, $font_file, $text2);
ImagePNG ($Bild);
Wo liegt da der Fehler?
|

29-02-2012, 21:09
|
DjDope
Registrierter Benutzer
|
|
Registriert seit: Feb 2012
Beiträge: 9
|
|
Keiner eine Idee?
|

29-02-2012, 21:23
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.803
|
|
imagettftext benötigt sowohl die gdlib als auch freetype. Sind beide Erweiterungen bei dir vorhanden? Ansonsten solltest du ggf. nur die Funktionen der gdlib benutzen.
Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

01-03-2012, 00:52
|
DjDope
Registrierter Benutzer
|
|
Registriert seit: Feb 2012
Beiträge: 9
|
|
Ist beides vorhanden, ich nutze wie gesagt den selben Code mit ein paar DB-Abfragen zusammen in 2 Scripten auf dem selben Server und da funktioniert es ohne probleme, nur hier funktioniert es auf einmal nicht mehr.
|

02-03-2012, 11:08
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
|
|
Zitat:
Zitat von DjDope
Hi,
ich hab ein Script das ich mir vor Jahren mal zusammengebastelt habe um Bilder mit Text zu versehen wieder rausrgekramt und wollte was anderes daraus machen, nun hab die ganzen Funktionen etc. die ich nicht mehr benötige ausgebaut und alles läuft noch 1a mit diesem Code, wenn ich dann aber mit imagefttext einen Text einfügen will wird mir das Bild nicht mehr angezeigt. Der imagefttext-Teil des Codes ist der Originale aus dem OriginalScript, sollte also eigentlich keine Probleme machen, tut er aber!
Hier der Code mit dem ich arbeite (der Fehler liegt sicher am imagefttext da es funktioniert wenn der imagefttext-teil weg ist)
|
Du weißt zwar nicht genau, was dein Quelltext macht, bist dir aber sicher, dass der Fehler an imagefttext liegt?
Dreh error_reporting() auf die höchste Stufe, schalte das Error-Logging ein. Außerdem liefern viele Funktionen einen Rückgabewert. Den kann man sich anzeigen lassen. Schließlich kann imagePNG() die Binärdaten der Grafik auch in eine Datei speichern, anstatt sie direkt in den Ausgabekanal zu schieben. Mach das mal und entferne die header()-Ausgaben, dann siehst du vielleicht auch eine Fehlermeldung.
Auch würde ich mal nachsehen, ob die Font-Datei "southpark.ttf" überhaupt im aktuell erreichbaren Pfad liegt. Bei TTF müsste übrigens auch imagettftext() funktionieren. Imagefttext() benötigt (laut Handbuch) ein mit Freetype2 compiliertes PHP. Ob das bei dir der Fall ist, sagt dir phpinfo() (mit Versionsinformation) oder gd_info() (ohne Versionsinformation).
|

02-03-2012, 14:38
|
DjDope
Registrierter Benutzer
|
|
Registriert seit: Feb 2012
Beiträge: 9
|
|
Das ist es ja, alles ist soweit korrekt und das Bild wird auch generiert und angezeigt wenn ich das imageftttext weglasse. Und imagettftext kann ich nicht verwenden da ich die Größe einstellen will etc. das geht ja nur bei imagefttext. Und Freetype etc. ist alles vorhanden, das selbe Script mit DB-Abfragen etc. funktioniert tadellos auf dem selbem Server.
PHP-Code:
# Typ festlegen, vorher exestieren KEINE Zeichen!
header ("Content-type: image/png");
# $ges wird per GET übergeben und hat den Wert 1
$ges = $_GET["ges"];
# $pic wird per GET übergeben und hat den Wert 10
$pic = $_GET["pic"];
# $text1 wird Urlencoded per GET übergeben und hat den Wert "TESTTEXT" (Ohne ")
$text1 = $_GET["text1"];
# $text2 wird Urlencoded per GET übergeben und hat den Wert "Hallo Welt" (Ohne ")
$text2 = $_GET["text2"];
# Festlegen der ersten Schriftgöße
$gros = "12";
# Festlegen der zweiten Schriftgröße
$gros2 = "10";
# Font-File festlegen, liegt im selben Verzeichniss wie alle anderen Dateien
$font_file = "southpark.ttf";
# Bildnamen und Pfad erstellen (1/10.png)
$vorl = "$ges/$pic.png";
# Bildvorlage einlesen
$Bild = ImageCreateFromPNG($vorl);
# Schriftfarbe 1 festlegen
$black = imagecolorallocate($Bild, 0x00, 0x00, 0x00);
# ersten Text einfügen
imagefttext($Bild, $gros, 0, 14, 125, $black, $font_file, $text1);
# zweiten Text einfügen
imagefttext($Bild, $gros2, 0, 44, 125, $black, $font_file, $text2);
# Bild ausgeben
ImagePNG ($Bild);
|

02-03-2012, 16:34
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.709
|
|
Hallo,
Zitat:
Zitat von DjDope
Und imagettftext kann ich nicht verwenden da ich die Größe einstellen will etc. das geht ja nur bei imagefttext
|
natürlich kannst du auch bei imagettftext die Schriftgröße angeben. Davon angesehen hat dir fireweasel bereits die häufigsten Fehlerquellen aufgelistet und dich auf das Error-Reporting verwiesen. Vielleicht solltest du seine Hinweise mal der Reihe nach abarbeiten und dir vor allem die Unterschiede zwischen diesem und dem funktionierenden Script herausarbeiten. Wenn die so gleich wären, wie du sagst,müsste es ja funktionieren. Also liegt der Fehler offenbar doch in den kleinen Unterschieden und das kann sogar mal „nur“ ein unterschiedlicher Pfad sein.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

02-03-2012, 17:15
|
DjDope
Registrierter Benutzer
|
|
Registriert seit: Feb 2012
Beiträge: 9
|
|
Des Rätsels Lösung: Der Fontname darf wohl nur 8+3 Zeichen lang sein, war aber 9+3, jetzt einfach das Park weg gelassen und es geht
 allen für die Hilfe
|

02-03-2012, 17:38
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.709
|
|
Zitat:
Zitat von DjDope
Des Rätsels Lösung: Der Fontname darf wohl nur 8+3 Zeichen lang sein, war aber 9+3, jetzt einfach das Park weg gelassen und es geht
 allen für die Hilfe
|
 Darauf wär ich nie gekommen. Wenn es wirklich daran lag, solltest du einen Bug Report posten.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

03-03-2012, 02:00
|
DjDope
Registrierter Benutzer
|
|
Registriert seit: Feb 2012
Beiträge: 9
|
|
Zitat:
Zitat von AmicaNoctis
 Darauf wär ich nie gekommen. Wenn es wirklich daran lag, solltest du einen Bug Report posten.
|
Bin ich auch nur durch zufall, dachte an die gute alte Dos-Zeit, da gingen doch auch nur 8+3
Bug Report posten? Wie/Wo soll ich sowas machen?
|

03-03-2012, 09:27
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.709
|
|
Zitat:
Zitat von DjDope
Bug Report posten? Wie/Wo soll ich sowas machen?
|
http://bugs.php.net/
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

05-03-2012, 13:27
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
|
|
Ich wollte ursprünglich schreiben, dass du zuerst einmal die Ursache dieses merkwürdigen Verhaltens recherchierst, bevor du einen Bugreport absetzt.
Zu spät.
Der Bug-Report wäre übrigens hier passender gewesen:
https://bitbucket.org/pierrejoye/gd-libgd/issues
Zitat:
Zitat von DjDope
Des Rätsels Lösung: Der Fontname darf wohl nur 8+3 Zeichen lang sein, war aber 9+3, jetzt einfach das Park weg gelassen und es geht 
|
So wie es aussieht, kann der Parameter $fontname mehrdeutig interpretiert werden[0]. Man kann damit mehrere Pfade angeben, an denen nach der Font-Datei gesucht wird. Bei älteren LibGD-Versionen war wohl als Separator für die verschiedenen Pfade ein Leerzeichen ( m() vorgesehen. Das gab selbstverständlich Probleme, wenn Pfade selbst Leerzeichen enthielten. Der Fehler wurde dadurch "behoben", dass jetzt ein Semikolon die Pfade trennt.
Zitat, PHP-Handbuch, Funktion imagefttext(), Parameter $fontfile:
Zitat:
(...)
When using versions of the GD library lower than 2.0.18, a space character, rather than a semicolon, was used as the 'path separator' for different font files. Unintentional use of this feature will result in the warning message: Warning: Could not find/open font. For these affected versions, the only solution is moving the font to a path which does not contain spaces.
In many cases where a font resides in the same directory as the script using it the following trick will alleviate any include problems.
(...)
|
Die Funktion imagettftext() ist (oder war) übrigens gleichermaßen betroffen.
Als ein Workaround wurde für Windows-Betriebssysteme auch der Short-Name-Trick empfohlen.
Die betroffene LibGD-Version 2.0.18 hat allerdings schon ein paar Jährchen auf dem Buckel. Aktuell dürfte 2.0.34 (oder neuer) sein. Leider konnte ich auf die Schnelle keine Übersicht finden, welche PHP-Version mit welcher GD-Version gebundelt wurde. Aber selbst wenn das die Ursache für dein Problem wäre, müsste dein PHP schon ziemlich betagt sein.
Zitat:
(...)
Depending on which version of the GD library PHP is using, when fontfile does not begin with a leading / then .ttf will be appended to the filename and the library will attempt to search for that filename along a library-defined font path.
(...)
|
Dieser Abschnitt lässt noch eine weitere Interpretation zu: Der Parameter $fontfile "vermurkst" lokale Pfadangaben (so wie deine). Unklar ist nur, wie eine Verkürzung des lokalen Pfades um ein Zeichen dann plötzlich gefunden werden sollte. Unter Windows könnte man per ProcessMonitor die Pfadaufrufe mitloggen um nachzuvollziehen, wie die Zeichenkette umgewandelt wird.
Auch müsste das Ersetzen des relativen Pfades durch einen absoluten den Fehler beseitigen. Probeweise so:
PHP-Code:
imagefttext(..., realpath($fontfile), ...);
--
[0] Genaueres lässt sich erst nach einem Blick in die (Freetype-?)Quellcodes sagen. Mal schauen ...
Der zweite Zitat-Abschnitt scheint Unsinn zu erzählen. Die Existenz eines Font-Files wird geprüft, indem an jeden angegebenen Pfad erst ein Leerstring, dann ".ttf", ".pfa", ".pfb" und schließlich ".dfont" angehängt wird.
https://bitbucket.org/pierrejoye/gd-.../gdft.c#cl-430
Begrenzungen der Namenslänge auf 8.3 Zeichen habe ich (bisher) keine entdecken können ...
Geändert von fireweasel (05-03-2012 um 14:15 Uhr)
Grund: ProcessMonitor nicht ...Explorer m(
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|