Antworten auf deine Fragen:
Neues Thema erstellen

imagepng() erzeugt halbe Ausgabe

rilight

Noch nicht viel geschrieben

Hallo liebes Forum!

Ich arbeite bereits seit mehreren Jahren mit PHP und sowas ist mir bis jetzt noch nicht passiert. Daher benötige ich euren Rat.

Folgender Code
PHP:
<?php
$pfad= "vorlage.jpg";

$info = getimagesize($pfad);
$x = $info[0];
$y = $info[1];

$rand = 20;

$neu = imagecreatetruecolor( $x + 2 * $rand, $y + 2 * $rand );
$vorlage = imagecreatefromjpeg($pfad);

if( !imagecopyresampled($neu, $vorlage, $rand, $rand, 0, 0, $x, $y, $x, $y) )
{
    die("Fehler mit imagecopyresampled()");
}
else
{
    imagedestroy($vorlage);

    header("Content-Type: image/png");
    imagepng($neu);
    imagedestroy($neu);
}

?>
Ziel des Skripts sollte eig. eine Grafik mit Rand sein.
Klingt erstmal sinnlos, ist aber ein Teil eines größeren Skripts ... nur funktioniert dieser Teil nicht, da brauch ich den Rest net zu programmieren.

Was kommt dabei raus?


Was sollte drauf sein?


Das Bild unten dient als Beispiel und kann / sollte auch mit jedem anderen jpeg funktionieren.
Mein Problem ist, dass das erstellte Bild nur mit ein paar Zeilen ausgegeben wird. Dann bricht das Bild ab.
Wenn ich es in Datei speichere per
PHP:
 imagepng($neu, "datei.png");
dann funktioniert es. Es soll aber später als Bild Link verwendet werden, also muss es die Daten direkt ausgeben.

XAMPP neustarten hat nichts gebracht. Auch ein anderer Webserver auf einem anderen System liefert das gleiche Problem.

Was mache ich falsch?


Liebe Grüße & Danke im Voraus
rilight
 

Duddle

Posting-Frequenz: 14µHz

AW: imagepng() erzeugt halbe Ausgabe

Komplett unverändert übernommen funktioniert dein Code auf meinem lokalen Apache2 mit PHP5. Es liegt also grundsätzlich nicht am Code, sondern wohl eher daran wie er verarbeitet wird. Das heißt, ich vermute den Fehler in der Umgebung bzw. irgendeiner Einstellung des Servers. Du könntest ja mal probehalber in die Error-Logs vom Webserver schauen, vielleicht steht da ja etwas aufklärendes drin.

Ein Workaround wäre für dich, die erzeugten Bilder temporär zu speichern (du sagst ja, dann werden sie richtig erstellt), dem Nutzer zu zeigen und dann wieder zu löschen. So zum Beispiel:
PHP:
//dein Code
else
{
    imagedestroy($vorlage);

    $filename = time().rand(0,999999).".png";
    imagepng($neu,$filename);
    imagedestroy($neu);

    header("Content-Type: image/png");
    echo file_get_contents($filename);
    unlink($filename);
}
Der Dateiname ist hier nur so beispielhaft konstruiert, um mögliche Überschneidungen bei zwei parallelen Aufrufen sehr unwahrscheinlich zu machen.


Duddle
 

hub

nicht ganz neu hier

AW: imagepng() erzeugt halbe Ausgabe

Moin moin,
ich kann mich schwach erinnern, das die GD-Bibliothek einen temp-Pfad braucht bin mir aber nicht 100 pro sicher.

Gruß Ulli
 

rilight

Noch nicht viel geschrieben

AW: imagepng() erzeugt halbe Ausgabe

Ich habe XAMPP unter den gegebenen Umständen mal auf die aktuelle Version geupdated. (Jetzt gibt es einen extra Button für die logs ;-))
Fehler bleibt aber.

@Duddle
Wundert mich schon, dass es bei dir on-the-fly-läuft.
Mein beschriebenes Problem tritt auf Win 7 mit aktuellem XAMPP und auf der Syno NAS auf. Damit schonmal 2 Systeme, die unabhängig voneinander den gleichen Fehler erzeugen.

Ich habe außerdem nochmal den Mac hergenommen mit nem älteren Mac-Build von XAMPP, da läuft der Code, wie du gesagt hast, ohne Probleme.

Logs hab ich auf Windows auch angeschaut, weder im Errorlog von PHP, noch vom Apachen taucht zum Zeitpunkt des Aufrufens ein Fehler auf. Sehr schade, das bringt uns leider nicht weiter.

@hub
Wofür braucht gd einen tmp-pfad? Meines Wissens nach werden Bilder im RAM gespeichert, falls du das meinst?!
 

Duddle

Posting-Frequenz: 14µHz

AW: imagepng() erzeugt halbe Ausgabe

Dann scheinen die Probleme mit Windows zusammen zu hängen (ich bin auf Linux). Ich finde auf die schnelle niemand anderen mit dem Problem. In so einem Fall helfen immer nur Debug-Informationen, also Logfiles usw.

Eine wilde Vermutung ist, dass irgendeine Einstellung irgendwie den maximalen Speicherverbrauch extrem begrenzt. Das könntest du testen indem du eine andere, sehr kleine Vorlage nimmst und die ausprobierst. Falls das geht, nimm eine andere, größere Vorlage und schau ab wann die Probleme auftreten.


Duddle
 

rilight

Noch nicht viel geschrieben

AW: imagepng() erzeugt halbe Ausgabe

@duddle

Mein Testbild (was ich angehangen hatte) war 640x400px.
Mit deinem vorgeschlagenen Test:

64*40 - passt, Bild kommt sofort!
128*80 - langsam, nur noch halbes Bild.

Merkwürdig ist auch die Geschwindigkeit. Auf dem Mac braucht er keine Sekunde für das 640er - Bild, auf Win braucht er für das 128er - Bild ca. 5-6s bis die Seite fertig geladen ist. Sofort kommt der Streifen - also das eig. richtige Bild. Die 5-6s braucht er für den Teil der weiß ist.

Das muss irg.was mit Speicher oder Buffer etc. zu tun haben, denn je kleiner das Bild, desto größer der korrekt dargestellte Bereich (relativ gesehen zur Höhe des Bilds).

Hier nochmal ausgerechnet:

Beim 128er Bild ist der korrekte Ausschnitt 168*49 = 8.232px (von 168*120 = 20.160px), das entspricht 40,8%.
Beim 640er Bild ist der korrekte Ausschnitt 680*25 = 17.000px (von 680*440 = 299.200), das entspricht 5,7%.

Weißt du zufällig, ob man im XAMPP irg.welche Buffer oder was-auch-immer zurücksetzen kann / muss?!
 

Duddle

Posting-Frequenz: 14µHz

AW: imagepng() erzeugt halbe Ausgabe

Ich meinte zwar klein im Sinne von Dateigröße in Kilobyte, aber zumindest sehen wir schon mal ein verändertes Verhalten. Der nächste Schritt wäre wohl ein erhöhen des maximalen Speichers, entweder in der php.ini oder per
PHP:
ini_set('memory_limit', '32M'); //bzw. 64 usw.
Du kannst auch mal mit phpinfo() nach dem derzeitigen memory_limit schauen.

Es kann aber auch sein, dass es garnichts mit dieser Einstellung zu tun hat. Normalerweise kommen Fehlermeldungen, wenn der Speicherverbrauch ausgenutzt ist - es sei denn du hast diese ausgeschaltet. Setz mal an den Anfang deines Scripts ein
PHP:
error_reporting(E_ALL);
Falls ein Fehler auftritt und die Meldung "Header information already sent" erscheint, dann kommentier die Zeile mit header() aus und ruf das Script nochmal auf um die Meldungen lesen zu können.


Duddle
 

rilight

Noch nicht viel geschrieben

AW: imagepng() erzeugt halbe Ausgabe

E_ALL ist glaube Standard bei XAMPP, aber ich habe es nochmal eingeschaltet.

Memory ist laut ini_get auf 128M.

Bei angenommenen 3 Byte / Px würde man bei dem 640er auf 897.600 Byte kommen, dass sind gerade mal rund 900 kb - daran kann es eher nicht liegen =( - wie du ja auch schon richtig angemerkt hattest, würde sonst eine Fehlermeldung kommen.

Auch ein ausführlicher Blick in phpinfo() hat nichts nennenswertes gebracht.

=(
 

Duddle

Posting-Frequenz: 14µHz

AW: imagepng() erzeugt halbe Ausgabe

Du kannst ja mal Script-gesteuert ein 1x1-Bild, ein 1x2-Bild, ein 2x2-Bild usw. zu erstellen. Sobald das erste nicht mehr korrekt erzeugt wird, dann schau dir die Dateigröße an. Ich wette, da gibt es eine magische Grenze (exakt 1000 Byte? usw), nach der du dann googlen oder deine Konfigurationsdateien durchsuchen kannst.

Aber wie gesagt, der Workaround sollte davon unabhängig funktionieren.


Duddle
 
D

dtzzz

Guest

AW: imagepng() erzeugt halbe Ausgabe

Das gleiche Problem habe ich seit heute auch. Als ob ein Windowsupdate das nun verursachen würde. Vorher lief alles ohne Probleme und das Bild wurde nicht ein mal nach 1sec. da.

Mit ob_start(); header("Content-type: Image/png"); imagepng($source, ""); ob_end_flush();

konnte ich lediglich erreichen, dass das Bild vollständig angezeigt wird. Allerdings sind die Ladezeiten immer noch bei 5-6sec.
 
Zuletzt bearbeitet von einem Moderator:

rilight

Noch nicht viel geschrieben

AW: imagepng() erzeugt halbe Ausgabe

Hey Ho,

ich hab heute Abend gleich mal wieder rumprobiert.

@duddle
Ich habe deinen Hinweiß mit
PHP:
echo file_get_contents( "./".$tmpName );
ausprobiert und es funktioniert.

Ich schreib gerade nochmal ein Skript um alle möglichen Bildgrößen zu erzeugen. Mal sehen was da rauskommt. Dazu werde ich nochmal Feedback geben.

Ich glaub ich hatte es noch nicht geschrieben:
PHP:
imagejpeg(...)
macht den gleichen Müll.

Sogar wenn man einfach ein Bild läd und dann ausgibt. Also nichtmal einen Bildausschnitt kopiert.

----- edit @02.46

Mein AJAX - PHP Skript ist fertig =)
Ich glaube ich habe heute Nacht sowas an die 10 - 20k Bilder erstellt in der Testphase. Momentan läuft der finale Test mit ca 5.000 Bildern. Dabei wird von einer großen Vorlage immer ein Teil kopiert und mit Rand versehen. Es werden hier alle möglichen Kombinationen der Bildgröße generiert.

Mal schauen ob dann Fehler drinne sind.
Aber wie schon vorher geschrieben, tritt der Fehler nur auf, wenn man es an den Browser ausgibt.

Gn8
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
118.635
Beiträge
1.538.477
Mitglieder
67.559
Neuestes Mitglied
hanuta
Oben