Anzeige

imagepng() erzeugt halbe Ausgabe

imagepng() erzeugt halbe Ausgabe | PSD-Tutorials.de

Erstellt von rilight, 09.11.2012.

  1. rilight

    rilight Noch nicht viel geschrieben

    Dabei seit:
    26.02.2007
    Beiträge:
    25
    Geschlecht:
    männlich
    Ort:
    Gth/Thür.
    Software:
    Gimp, Inkscape, PS CS6, AI CS6
    Kameratyp:
    Canon EOS 400d
    imagepng() erzeugt halbe Ausgabe
    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:
    1.  
    2. <?php
    3. $pfad= "vorlage.jpg";
    4.  
    5. $info = getimagesize($pfad);
    6. $x = $info[0];
    7. $y = $info[1];
    8.  
    9. $rand = 20;
    10.  
    11. $neu = imagecreatetruecolor( $x + 2 * $rand, $y + 2 * $rand );
    12. $vorlage = imagecreatefromjpeg($pfad);
    13.  
    14. if( !imagecopyresampled($neu, $vorlage, $rand, $rand, 0, 0, $x, $y, $x, $y) )
    15. {
    16.     die("Fehler mit imagecopyresampled()");
    17. }
    18. else
    19. {
    20.     imagedestroy($vorlage);
    21.  
    22.     header("Content-Type: image/png");
    23.     imagepng($neu);
    24.     imagedestroy($neu);
    25. }
    26.  
    27. ?>
    28.  
    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?
    [​IMG]

    Was sollte drauf sein?
    [​IMG]

    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:
    1.  
    2.  imagepng($neu, "datei.png");
    3.  
    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
     
    #1      
  2. Duddle

    Duddle Posting-Frequenz: 14µHz

    Dabei seit:
    03.02.2006
    Beiträge:
    3.864
    Geschlecht:
    männlich
    Ort:
    Dresden
    imagepng() erzeugt halbe Ausgabe
    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:
    1.  
    2. //dein Code
    3. else
    4. {
    5.     imagedestroy($vorlage);
    6.  
    7.     $filename = time().rand(0,999999).".png";
    8.     imagepng($neu,$filename);
    9.     imagedestroy($neu);
    10.  
    11.     header("Content-Type: image/png");
    12.     echo file_get_contents($filename);
    13.     unlink($filename);
    14. }
    15.  
    Der Dateiname ist hier nur so beispielhaft konstruiert, um mögliche Überschneidungen bei zwei parallelen Aufrufen sehr unwahrscheinlich zu machen.


    Duddle
     
    #2      
  3. hub

    hub nicht ganz neu hier

    Dabei seit:
    11.06.2008
    Beiträge:
    1.116
    Geschlecht:
    männlich
    Ort:
    Taunus
    Software:
    PS,Lr. VS Code, NP++, ...
    Kameratyp:
    Sony a 6000
    imagepng() erzeugt halbe Ausgabe
    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
     
    #3      
  4. rilight

    rilight Noch nicht viel geschrieben

    Dabei seit:
    26.02.2007
    Beiträge:
    25
    Geschlecht:
    männlich
    Ort:
    Gth/Thür.
    Software:
    Gimp, Inkscape, PS CS6, AI CS6
    Kameratyp:
    Canon EOS 400d
    imagepng() erzeugt halbe Ausgabe
    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?!
     
    #4      
  5. Duddle

    Duddle Posting-Frequenz: 14µHz

    Dabei seit:
    03.02.2006
    Beiträge:
    3.864
    Geschlecht:
    männlich
    Ort:
    Dresden
    imagepng() erzeugt halbe Ausgabe
    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
     
    #5      
  6. rilight

    rilight Noch nicht viel geschrieben

    Dabei seit:
    26.02.2007
    Beiträge:
    25
    Geschlecht:
    männlich
    Ort:
    Gth/Thür.
    Software:
    Gimp, Inkscape, PS CS6, AI CS6
    Kameratyp:
    Canon EOS 400d
    imagepng() erzeugt halbe Ausgabe
    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?!
     
    #6      
  7. Duddle

    Duddle Posting-Frequenz: 14µHz

    Dabei seit:
    03.02.2006
    Beiträge:
    3.864
    Geschlecht:
    männlich
    Ort:
    Dresden
    imagepng() erzeugt halbe Ausgabe
    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:
    1. 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:
    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
     
    #7      
  8. rilight

    rilight Noch nicht viel geschrieben

    Dabei seit:
    26.02.2007
    Beiträge:
    25
    Geschlecht:
    männlich
    Ort:
    Gth/Thür.
    Software:
    Gimp, Inkscape, PS CS6, AI CS6
    Kameratyp:
    Canon EOS 400d
    imagepng() erzeugt halbe Ausgabe
    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.

    =(
     
    #8      
  9. Duddle

    Duddle Posting-Frequenz: 14µHz

    Dabei seit:
    03.02.2006
    Beiträge:
    3.864
    Geschlecht:
    männlich
    Ort:
    Dresden
    imagepng() erzeugt halbe Ausgabe
    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
     
    #9      
  10. dtzzz

    dtzzz Noch nicht viel geschrieben

    Dabei seit:
    02.03.2011
    Beiträge:
    1
    Geschlecht:
    männlich
    imagepng() erzeugt halbe Ausgabe
    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: 13.11.2012
    #10      
  11. rilight

    rilight Noch nicht viel geschrieben

    Dabei seit:
    26.02.2007
    Beiträge:
    25
    Geschlecht:
    männlich
    Ort:
    Gth/Thür.
    Software:
    Gimp, Inkscape, PS CS6, AI CS6
    Kameratyp:
    Canon EOS 400d
    imagepng() erzeugt halbe Ausgabe
    AW: imagepng() erzeugt halbe Ausgabe

    Hey Ho,

    ich hab heute Abend gleich mal wieder rumprobiert.

    @duddle
    Ich habe deinen Hinweiß mit
    PHP:
    1.  
    2. echo file_get_contents( "./".$tmpName );
    3.  
    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:
    1.  
    2.  
    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: 16.11.2012
    #11      
x
×
×