Ankündigung

Einklappen
Keine Ankündigung bisher.

imagejpeg - ich stehe auf dem Schlauch

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • imagejpeg - ich stehe auf dem Schlauch

    Hallo!

    Irgendwie komme ich gerade nicht weiter. Ich habe die folgende Funktion, die schon mehrere Monate erfolgreich im Einsatz ist. Seit ein paar Tagen macht sie Mätzchen. Ich kriege ab und zu (nicht immer!) den Fehler "Konnte das Bild $i leider nicht erstellen."

    Für Hilfe wäre ich sehr dankbar.

    Gruß Moritz.

    PHP-Code:
     function editfoto2() {
          
                    
    # vars holen und checken
                    
    $ID $_POST['ID'];
                
                
    $Quality 75;

                
    $i 0;
                while (
    $i 4) {
                    
    $i++;
                    
    $Location "../images/$ID-$i.jpg";
                    
    $LocationThumbnail "../images/thumbs/$ID-$i.jpg";
                    
                    if (
    $_FILES["BILD$i"]['tmp_name']) { 
                
                    
    # bild verkleinern
                    
    list($Width$Height) = GetImageSize($_FILES["BILD$i"]['tmp_name']);

                    
    # Bilder sollen 400px breit oder hoch sein
                

                     # neue Maße errechnen
                     
    if ($Width 400) {

                     
    $NewWidth 400;
                     
    $NewHeight round(400*$Height/$Width);

                     } else {
                        
    $NewWidth $Width;
                        
    $NewHeight $Height;
                     }

                     if (
    $Width 144) {

                     
    $ThumbnailWidth 144;
                     
    $ThumbnailHeight round(144*$Height/$Width);

                     } else {
                        
    $ThumbnailWidth $Width;
                        
    $ThumbnailHeight $Height;
                     }
                

                    
    $OrgImage imagecreatefromjpeg($_FILES["BILD$i"]['tmp_name']);

                     
    # bild erstellen
                     
    $NewImage imagecreatetruecolor($NewWidth,$NewHeight);
                     
    imagecopyresized($NewImage$OrgImage,
                                      
    0000,
                                      
    $NewWidth$NewHeight$Width$Height);
                             
                    if (!
    imagejpeg($NewImage$Location$Quality)) {
                              
    $Return = array('-'"Konnte das Bild $i leider nicht erstellen.");
                              return 
    $Return;
                     }
     

                    
    #thumbnail erstellen
                    
    $NewImage imagecreatetruecolor($ThumbnailWidth,$ThumbnailHeight);
                    
    imagecopyresized($NewImage$OrgImage,
                                            
    0000,
                                            
    $ThumbnailWidth$ThumbnailHeight$Width$Height);

                    if (!
    imagejpeg($NewImage$LocationThumbnail$Quality)) {
                              
    $Return = array('-'"Konnte das Thumbnail vom Bild $i leider nicht erstellen.");
                              return 
    $Return;
                    }
                    


                    
    # in db updaten
                    
    $this->Handler[DB]->update(
                        
    'mallorca_estates',
                        array(
                            
    "bild$i=> "$ID-$i.jpg",
                        ),                                
                        
    "estateid = '$ID'"
                    
    );
                    
                    }
                }
                     
                     
                     
    # daten holen
                   
    list($bild1$bild2$bild3$bild4) = $this->Handler[DB]->Select_Single(
                        
    'bild5, bild6, bild7, bild8',
                        
    'mallorca_estates',
                        
    "estateid = '$ID'"
                   
    );
                   
                   
                   
    $vars = array(
                            
    bild1    => $bild1,
                            
    bild2    => $bild2,
                            
    bild3    => $bild3,
                            
    bild4    => $bild4,
                            
    ID        => $ID,
                    );
                   
    $Return = array('+'$vars);
                   return 
    $Return;
          
          
          
          } 

  • #2
    Wenn die Funktion ECHTE Mätzchen macht, würde ich sie für den Genetik-Nobelpreis vorschlagen. So ein Matz iss n ganz schöner Brocken Arbeit für ne kleine Funktion.

    Vielleicht findest Du aber auch die Musse, die Mätzchen hier etwas näher zu erleutern und aus dem Nobelpreis wird doch nichts - mal sehen....

    Kommentar


    • #3
      $_FILES["BILD$i"]['tmp_name'
      $OrgImage = imagecreatefromjpeg($_FILES["BILD$i"]['tmp_name']);
      $NewImage = imagecreatetruecolor($NewWidth,$NewHeight);
      $NewImage = imagecreatetruecolor($ThumbnailWidth,$ThumbnailHei ght);
      hmmm, wenn ich mir das so ansehe, könnte man Vermuten, dass der Speicher nicht ausreicht.

      $_FILES["BILD$i"]
      Da werden wohl gleich mehrere erstellt ?
      imageDestroy() wird auch nicht benutzt -> najaaaaaaaaaaaaaaaaa

      Kommentar


      • #4
        Zitat von CIX88
        $_FILES["BILD$i"]['tmp_name'
        $OrgImage = imagecreatefromjpeg($_FILES["BILD$i"]['tmp_name']);
        $NewImage = imagecreatetruecolor($NewWidth,$NewHeight);
        $NewImage = imagecreatetruecolor($ThumbnailWidth,$ThumbnailHei ght);
        hmmm, wenn ich mir das so ansehe, könnte man Vermuten, dass der Speicher nicht ausreicht.

        $_FILES["BILD$i"]
        Da werden wohl gleich mehrere erstellt ?
        imageDestroy() wird auch nicht benutzt -> najaaaaaaaaaaaaaaaaa
        Hallo,

        da kommt aber ne Fehlermeldung irgendwas mit allocated memory,
        error-reporting wäre nicht schlecht, buffer overflow könnte man ggf. mit flush() lösen.

        da kämen wir aber ins raten, was ist, wenn eine Datei schon mit dem Namen existiert ? oder sich das Dateirechtesystem geändert hat, weil der webhoster Mist gebaut hat

        ich hatte eine einfaches Programm geschrieben und 500 Verzeichnisse mit Bildern im Format 1600x1200 in kleinere Bilder umgewandelt werden, allerdings mit Prüfung ob die Datei schon vorhanden ist oder ob das grössere Bild neueren Datums ist, als das alte
        eigentlich sollte nach jeder Bildbearbeitung der Speicher wieder freigegeben, also imagedestroy() werden und ggf. der Puffer mit flush();

        da bei solchen Aktionen das script wegen der Ausführungszeit abbrechen könnte, habe ich den Fehler vermeide indem ich die Zeit messe und dann vorher das script sterben lasse und neu starte.


        hier mal ein Beispiel miit Zwischenspeicherung, was auch eine Lösung wäre, ist zwar nicht besonders elegant, aber dafür gehts immer
        bilds ist dann das Nachschärfen bei kleinen Bildern, wobei bilds dann den Imageheader ausgibt:
        PHP-Code:
        if(file_exists($fileout)){...} // Fehlerbehandlung z.B. 01,02,03 etc.
        if ($fileout !="") { imagejpeg($thumb2$fileout);
        ... 
        // gekürzt
        if(isset($rot)){
        $image imagecreatefromjpeg($fileout);
        $thumb2=imagerotate($image,$rot,0);
        imagejpeg($thumb2$fileout);} 
        @
        chmod($fileout,0777);
        imagedestroy($image);
        if(
        $pf=="kl_"){
        header('Location:bilds.php?filename='.$fileout);}
        else{
        header('Content-type: image/jpeg');
        imagejpeg($thumb2); }
        // endif fileout!="" 
        edit:
        wenn man bedenkt wieviele Bilder screenshot.jpg heissen

        Kommentar


        • #5
          buffer overflow könnte man ggf. mit flush() lösen
          Aber nicht bei der Anwendung mit der GDlib.

          also imagedestroy() werden und ggf. der Puffer mit flush();
          Was haste denn laufend mit flush() ?
          Das ist hier fehl am Platz !

          Kommentar


          • #6
            Zitat von CIX88
            buffer overflow könnte man ggf. mit flush() lösen
            Aber nicht bei der Anwendung mit der GDlib.

            also imagedestroy() werden und ggf. der Puffer mit flush();
            Was haste denn laufend mit flush() ?
            Das ist hier fehl am Platz !
            mit flush() wird der gesamte Ausgabepuffer geleert und hat in der Tat nichts mit der gdlib zu tun, sondern z.B. damit das alle Fehlermeldungen sofort erscheinen

            Kommentar


            • #7
              Erstmal danke für die Antworten.

              Ich habe jetzt auch imagedestroy eingebaut. Hatte ich vergessen.

              Aber daran liegt es nicht. Es wird ja schon beim ersten Bild abgebrochen und außerdem funktioniert es ja - wie schon beschrieben - ab und zu.

              Eine Fehlermeldung wird nicht angezeigt. Wie lasse ich mir die ausgeben?

              Edit: Die Rechte hatte ich auch überprüft. Offen wie ein Scheunentor: 777. Außerdem funktioniert es ja ab und zu.

              Kommentar


              • #8
                error_reporting im PHP-Handbuch
                und
                http://www.phpcenter.de/de-html-manu...le-upload.html

                errors.log vom webserver könnte ggf. Aufschluss geben.
                oder noch ein paar Sachen einbauen, z.B.
                PHP-Code:
                <?php
                  
                if (file_exists($Location)) {
                                          
                $Return = array('-'" Bild $i lschon vorhanden");
                                          return 
                $Return
                if (!
                imagejpeg($NewImage$Location$Quality)) {
                                          
                $Return = array('-'"Konnte das Bild aus $ID $i leider nicht erstellen.");
                                          return 
                $Return
                ?>
                mit fileperms, fileowner könnte man noch prüfen, ob es Probleme bei der Rechtevergabe gab-

                edit: Überprüfung von $ID ggf. auch - soll ein bestehendes Bild überschrieben werden, so muss man natürlich jedes Bild Schreibrechte vergeben, je nach Sever sind das 644 oder 755, am sichersten 777
                aber mit einer Null
                chmod($Location,0777);

                kommt da ne Fehlermeldung war $Location nicht vorhanden,
                für den Betrieb kann man später besser @chmod($Location,0777); verwenden, was dann eine Fehlermeldung verhindert

                Kommentar


                • #9
                  Nee, daran, dass das Bild evtl. schon vorhanden ist, liegt es auch nicht.

                  Jedenfalls habe ich das ganze Script jetzt auf einen anderen Server gepackt. Und hier funktioniert alles wie gewünscht.

                  Kommentar


                  • #10
                    mit flush() wird der gesamte Ausgabepuffer geleert und hat in der Tat nichts mit der gdlib zu tun
                    Das ist ja ein lustiges Thread hier

                    da kommt aber ne Fehlermeldung irgendwas mit allocated memory,
                    Jo wenn Bilder erstellt werden, sollte man dann ALLES wieder aus dem Speicher freigeben, auch das Thumbnailbild.
                    Was allerdings beim obrigen Beispiel nicht zu sehen ist.

                    imagejpeg($thumb2)
                    Hier fehlt auch ImageDestroy() !

                    Wenn der Speicher nicht mehr ausreicht, hilft auch kein flush().
                    Das halbfertige Bild (infolge mangels Speicher) ist dann nicht komplett und da kann nichts mehr ausgegeben oder gespeichert werden.

                    PS: Allein dein Bild mit 1600x1200 verbraucht schon fast 10MB im Speicher, ohne dem Thumbnail, was auch noch dazu gerechnet werden muss.

                    Kommentar


                    • #11
                      [quote="CIX88"]

                      imagejpeg($thumb2)
                      Hier fehlt auch ImageDestroy() !

                      Wenn der Speicher nicht mehr ausreicht, hilft auch kein flush().
                      Das halbfertige Bild (infolge mangels Speicher) ist dann nicht komplett u
                      nd da kann nichts mehr ausgegeben oder gespeichert werden.

                      PS: Allein dein Bild mit 1600x1200 verbraucht schon fast 10MB im Speicher, ohne dem Thumbnail, was auch noch dazu gerechnet werden muss.
                      Hallo,
                      erstmal habe ich mein script für den Post gekürzt
                      zu imagejpeg($thumb2), da mache ich das schon richtig

                      warum kommt man auf 10 MB bei 1600x1200 :

                      gemessen mit http://www.de2.php.net/memory_get_usage() (Linux).

                      IMHO errechnet sich der Speicherbedarf mit 1600x1200x3 Bytes oder in
                      1600x1220x3/1024/1024 in MB d.h. dann 5,49 MB ohne was bearbeitet zu haben

                      (1 MB = 1024 kB =1024*1024 Bytes; 1 Byte hat 8 Bit);

                      aber zum Verständnis die Ausgabe beim Bild erzeugen und einkopieren in eine leeres schwarzes Bild kommt da als Ausgabe:
                      arrays=64480
                      imagecreate=9681464
                      imagecreatetruecolor=9840256 / 1600x1200 = 9,3 MB
                      imagealphablending=9840352
                      imagedestroy=223472 // da bleibt noch was hängen
                      thumb2=344832 // thumb erzeugen
                      alphablending thumb2=344832
                      imagejepeg=344912
                      imagedestroy thumb2=223600

                      nach jedem Befehl habe ich mir ausgegeben:

                      PHP-Code:
                      imagedestroy($thumb2);
                      echo 
                      "imagedestroy thumb2=".memory_get_usage()."\n"
                      in einer Schleife bleibt also immer noch was hängen, dh. imagedestroy somit kein Allheilmittel,
                      aber man sieht deutlich, dass ohne imagedestroy am Ende über 10 MB rauskämen,
                      meist ist da das Ende der Fahnenstange beim webhoster erreicht,
                      d.h. ich muss um jedes Byte kämpfen, alle Variablen und Arrays putzen.[/php]

                      Kommentar


                      • #12
                        Zitat von aberchen
                        warum kommt man auf 10 MB bei 1600x1200 :
                        Frag das den Programmierer von GD.

                        gemessen mit http://www.de2.php.net/memory_get_usage() (Linux).

                        IMHO errechnet sich der Speicherbedarf mit 1600x1200x3 Bytes oder in
                        1600x1220x3/1024/1024 in MB d.h. dann 5,49 MB ohne was bearbeitet zu haben
                        Die Funktion berechnet definitiv nicht den Speicherbedarf der Extension sondern nur den verplemperten Speicherbedarf, wenn die Funktion (ohne Speichermangel) bis zum Return durchgerannt ist.

                        btw.: wäre GD ein PHP Script, würde ich dagegen wettern, was das Zeug hält. In der Extension wird sehr viel und ganz falsch erledigt.

                        Kommentar


                        • #13
                          Zitat von ignatz
                          Zitat von aberchen
                          warum kommt man auf 10 MB bei 1600x1200 :
                          Frag das den Programmierer von GD.

                          gemessen mit http://www.de2.php.net/memory_get_usage() (Linux).

                          IMHO errechnet sich der Speicherbedarf mit 1600x1200x3 Bytes oder in
                          1600x1220x3/1024/1024 in MB d.h. dann 5,49 MB ohne was bearbeitet zu haben
                          Die Funktion berechnet definitiv nicht den Speicherbedarf der Extension sondern nur den verplemperten Speicherbedarf, wenn die Funktion (ohne Speichermangel) bis zum Return durchgerannt ist.

                          btw.: wäre GD ein PHP Script, würde ich dagegen wettern, was das Zeug hält. In der Extension wird sehr viel und ganz falsch erledigt.
                          ich meinte damit das eigentlich nur 5,49 MB Speicher belegt würden dürften, aber es tatsächlich mehr ist, aber ob die ImageMagick oder netbpm (oder netb???) weniger Speicher benötigen ?

                          Kommentar


                          • #14
                            ich muss um jedes Byte kämpfen
                            Nun rechne das mal hoch, wenn man dann eine Thumbnail-Funktion innerhalb einer Schleife benutzt wird

                            warum kommt man auf 10 MB bei 1600x1200
                            Dazu brauch ich keine PHP-Funktion - nur ein Taschenrechner

                            Kommentar


                            • #15
                              Zitat von aberchen
                              ..., aber es tatsächlich mehr ist, aber ob die ImageMagick oder netbpm (oder netb???) weniger Speicher benötigen ?
                              Diese beiden Tools fordern ihren Speicherbedarf vom System während das PHP Script mit dem auskommen muß, was memory_limit erlaubt.

                              Kommentar

                              Lädt...
                              X