imgapng erzeugt "Grafik kann nicht angezeigt werden, da sie Fehler enthält"
Klaus1
- php
Hallo,
womöglich sehe ich den Wald vor lauter Bäumen nicht, aber ich bekomme es nicht hin, dass mir die erstellte Grafik angezeigt wird.
Ich hab das Script von einem Windows-Server auf einen Linux-Server übertragen. Auf dem Windows-Server läuft es einwandfrei.
Zum Hintergrund: Erstellt werden soll ein Captcha-Bild.
Zum Testen speichere ich das Bild ab. Das Bild wird auch korrekt erzeugt und gespeichert und ich kann es mir problemlos anzeigen lassen. Nur eben nicht im Browser. Die GD-Library ist also installiert und die Berechtigungen passen auch.
Ich habe darauf geachtet, dass keine Leerzeilen oder Kommentarzeilen enthalten sind und sogar versucht vorher alle womöglich vorhandenen header zu entfernen (siehe erste 4 Zeilen). Im Editor sieht die gespeicherte PNG-Datei auch OK aus (PNG-Header und keine PHP-codes).
Ich hoffe, dass Ihr noch einen Tipp oder gar die Lösung für mich habt.
LG Klaus
Hier das Script:
foreach (getallheaders() as $name => $value) {
header_remove($name);
}
ob_end_clean();
header("Cache-Control: no-cache, must-revalidate");
header('Content-type: image/png');
$characters = "ABCDEFGHJKLMNPRSTUVWXYZabcdefghjkmnprstuvwxyz23456789";
$length = 5;
$code = "";
while( strlen($code) < $length ) {
$code .= substr($characters, mt_rand() % (strlen($characters)), 1);
}
session_start();
$_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 = 34;
$font = "../font/times_new_yorker.ttf";
$img = imagecreatefrompng($background);
$color = imagecolorallocate($img, 255, 255, 255);
imagettftext($img, $font_size, $angle, 10, 50, $color, $font, $code);
imagepng($img,'../images/test1.png',0,NULL);
imagedestroy($img);
Tach!
Zum Testen speichere ich das Bild ab. Das Bild wird auch korrekt erzeugt und gespeichert und ich kann es mir problemlos anzeigen lassen. Nur eben nicht im Browser.
Da wäre jetzt die zu klärende Frage, was der Browser statt des Bildes bekommt. Rechtsklick, Quelltext anzeigen, oder im Netzwerk-Bereich der Browsertools den Request anschauen und prüfen, was da als Response kommt.
dedlfix.
IE zeigt mr das:
<html>
<head>
</head>
<body>
<img width="28" height="30" src="https://meineseite/scripts/captcha.php">
</body>
</html>
Der Antwort-Header sieht wie folgt aus:
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: Keep-Alive
Content-Length: 0
Content-Type: image/png
Date: Wed, 31 Oct 2018 07:43:46 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=15, max=100
Pragma: no-cache
Server: Apache
Alles weitere habe ich bisher noch nie gemacht, da müsste ich dann wissen, wie ich genaueres analysieren kann.
Tach!
IE zeigt mr das:
<html> <head> </head> <body> <img width="28" height="30" src="https://meineseite/scripts/captcha.php"> </body> </html>
Das ist HTML, kein Bild. Du musst das anschauen, wenn du die Bild-URL aufrufst, nicht das einbettende HTML-Dokument.
Der Antwort-Header sieht wie folgt aus:
Der Inhalt muss stimmen, nicht nur die Header. Also schau auch die Response selbst an.
Content-Length: 0
Aber das sieht sehr verdächtig danach aus, dass der Server gar nichts sendet.
Wenn es nicht an der inkorrekten Verwendung von imagepng() (Dateinamen angegeben statt null) liegen würde, kann auch bei der Ursachenforschung helfen, Fehlermeldungen einzuschalten, also error_reporting auf E_ALL setzen und display_errors auf true, und dann nochmal die Response anzuschauen.
dedlfix.
In der FF Netzwerkanalyse steht:
Status 200
Methode GET
Datei captcha.php
Ursprung document
Typ png
Übertragen 310 B
Größe 0
Es sieht also wirklich so aus, als wenn nichts gesendet wird, obwohl die Grafik ja korrekt erstellt und gespeichert wird. Nur warum sendet er die Grafik nicht auch an den Client, denn das folgende Script wird auch im Browser korrekt angezeigt:
header('Content-type: image/png');
$myImage = imagecreate(200, 100);
$myGray = imagecolorallocate($myImage, 204, 204, 204);
$myBlack = imagecolorallocate($myImage, 0, 0, 0);
imageline($myImage, 15, 35, 120, 60, $myBlack);
imagepng($myImage);
imagedestroy($myImage);
LG Klaus
Hi,
Zum Testen speichere ich das Bild ab. Das Bild wird auch korrekt erzeugt und gespeichert und ich kann es mir problemlos anzeigen lassen. Nur eben nicht im Browser.
ich seh in dem Script nichts, was das Bild an den Browser sendet …
cu,
Andreas a/k/a MudGuard
Hi,
Was müsste ich denn tun, damit eine Augabe erfolgt?
Und warum funktioniert das folgende Script dann ohne Fehler? Denn da erfolgt ja doch genausowenig eine Ausgabe?
header('Content-type: image/png');
$myImage = imagecreate(200, 100);
$myGray = imagecolorallocate($myImage, 204, 204, 204);
$myBlack = imagecolorallocate($myImage, 0, 0, 0);
imageline($myImage, 15, 35, 120, 60, $myBlack);
imagepng($myImage);
imagedestroy($myImage);
LG Klaus
Tach!
Was müsste ich denn tun, damit eine Augabe erfolgt?
imagepng() richtig verwenden.
Und warum funktioniert das folgende Script dann ohne Fehler? Denn da erfolgt ja doch genausowenig eine Ausgabe?
imagepng($myImage);
Hier verwendest du imagepng() mit nur einem Parameter, im anderen Code war noch die Angabe eines Dateinamens dabei, der die Ausgabe steuert.
dedlfix.
Das gibts nicht....
Ich hatte zu Anfang bei mir auch nur imagepng($img);
stehen.
Zur Fehleranalyse und in Foren wurde darauf hingewiesen, dass neuere Versionen die Parameter benötigen würden.
Jetzt, wo ich die Parameter wieder entfernt habe, funktioniert alles.
Sehr merkwürdig. Aber ok, hauptsache es funktioniert jetzt und vielen Dank für Eure Unterstützung!
LG Klaus
Tach!
Ich hatte zu Anfang bei mir auch nur
imagepng($img);
stehen. Zur Fehleranalyse und in Foren wurde darauf hingewiesen, dass neuere Versionen die Parameter benötigen würden.
Die einzige ausschlaggebende Quelle ist das PHP-Handbuch. Auch wenn man Tipps bekommt, darf das nicht die Lektüre der Doku ersetzen. Tipps können beliebig falsch oder unvollständig sein, und das meist nicht aus bösem Willen.
dedlfix.