Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] imagecreatefromjpeg funktioniert zu 50%

Einklappen

Neue Werbung 2019

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

  • [Erledigt] imagecreatefromjpeg funktioniert zu 50%

    Hallo Liebe PHP-Gemeinde,

    ich hoffe ich bin mit der Einstuffung der schwierigkeit des Problems hier richtig.

    Ziel:

    Ich versuche mit einem Uploadform und der GDLib ein Thumbnail mit Watermark zu erstellen.

    Problem:

    Thumbnail funktioniert bei vielen jpg's(einzig erlaubtes Format beim Upload) nicht.

    Versuche:

    1. Testform erstellt und Datei 'konventiert':
    imagecreatefromjpeg() -> imagegif
    imagecreatefromgif() -> imagejpeg

    Datei ueber das richtige Form hochgeladen und heraus kam nur mein Watermark... etc.

    2. mit einem HEX editor EOI bearbeitet:
    aus einigen Posts auf "ttp://de.php.net/manual/de/function.imagecreatefromjpeg.php" war zu entnehmen, dass bei vielen Herstellern die End of Images bei jpg's fehlerhaft sind.

    3. einiges, aber ich bin fuer jede Information sehr dankbar.

    Was koennten also noch fuer Probleme vorliegen?

  • #2
    Bilder zu groß und das Script bricht mit "Out of memory" Fehler ab?

    Zeig mal deinen Code. Dann kann man ggf. mehr dazu sagen.

    Kommentar


    • #3
      Es gibt viele JPEG "Dialekte"... ich weiß z.B. mit ziemlicher Sicherheit, das selbst Browser mit einigen JPG-Formaten Probleme haben, die von Photoshop erzeugt werden (dort gibt es explizites "Fürs Web speichern"). Das Problem liegt u.a. darin, das PS beim "normalen" Speichern noch zusätzliche (Meta-)Informationen und anderen Kram ins JPG speichert.

      Kommentar


      • #4
        Zitat von awak3 Beitrag anzeigen
        ...

        Thumbnail funktioniert bei vielen jpg's(einzig erlaubtes Format beim Upload) nicht.
        Errrmhhh, error_reporting() voll aufgedreht?
        Fehlerausgabe aktiviert oder Fehler-Log überprüft?

        Wenn du da drin irgendwo eine Meldung in der Art wie folgende siehst ...

        Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 40000 bytes) in path/myscript.php on line 0815
        ... dann musst du dein Memory-Limit ändern, den Hoster wechseln oder wahlweise die erlaubten Bild-Abmessungen (Höhe mal Breite, aber nicht Dateigröße) beschränken.

        Versuche:

        1. Testform erstellt und Datei 'konventiert':
        imagecreatefromjpeg() -> imagegif
        imagecreatefromgif() -> imagejpeg

        Datei ueber das richtige Form hochgeladen und heraus kam nur mein Watermark... etc.
        Dann hast du quasi nichts in die Bitmap mit der Watermark kopiert und anschließend diese Bitmap gespeichert? Sowas vermeidet man, wenn man die Rückgabewerte der Bildbearbeitungsfunktionen abfragt, bevor man weiter im Programm fortfährt. Allerdings sollte es auch da entsprechende Fehlermeldungen geben.

        2. mit einem HEX editor EOI bearbeitet:
        aus einigen Posts auf "ttp://de.php.net/manual/de/function.imagecreatefromjpeg.php" war zu entnehmen, dass bei vielen Herstellern die End of Images bei jpg's fehlerhaft sind.
        Versteh ich jetzt nicht. Der EOI-Marker besteht aus zwei feststehenden Byte-Werten. Wie soll der fehlerhaft sein? Höchstens fehlt er oder ist (äußerst selten) unvollständig. Ein halbwegs guter JPEG-Reader (wie der der LibGD) kann das ab, wenn vorher ausreichend Bildmaterial eingelesen werden konnte. Ich wüsste auch nicht, wie man diese zwei Bytes großartig "bearbeiten" könnte. Mehr Info bitte.

        3. einiges, aber ich bin fuer jede Information sehr dankbar.

        Was koennten also noch fuer Probleme vorliegen?
        In einer nicht besonders aussagekräftigen Fehlerbeschreibung.

        Außerdem könntest du die Dateien, die nicht funktionierten mal in einem vernünftigen Grafik-Anzeige-Programm testen um herauszubekommen, was sie gemeinsam haben und was sie von den funktionierenden unterscheidet. Irfanview bspw. zeigt auch unvollständige JPEGs an. In der unteren Statusleiste findest du auch den Speicherverbrauch (PHP mit der LibGD genehmigt sich allerdings noch etwas mehr).

        Kommentar


        • #5
          1. Also Fehlerausgaben habe ich keine mehr, trotz error_reporting(E_ALL); .
          Eine Fehlermeldung hatte ich vorher mit einem von mir beschaedigten Bild. (siehe 2.)
          • Memory ist genug gegeben.
          • MAX_SIZE auch genug da.


          2. EOI hatte ich bearbeitet, weil es in einigen Threads zum Thema wurde. Habe in dieser Richtung auch keine erfahrung, deshalb auch mehr als die ersten Bytes veraendert, was beim Uploadversuch zu einer Fehlermeldung durch GD fuehrte.

          3. Hier die Funktion:
          PHP-Code:
          function create_photo_thumb($fname$move_to$thumbWidth) {
                                      
          $img = @imagecreatefromjpeg($fname); 
                                      
          #echo $fname;
                                      
                                    
          if($img) {
                                        
          $width imagesx$img );
                                        
          $height imagesy$img );
                                          if(
          $width >= $height) {
                                                
          // calculate thumbnail size
                                          
          $new_width $thumbWidth;
                                              
          $new_height floor$height * ( $thumbWidth $width ) );
                                            
          // calculate picture position
                                          
          $rest1 92-$new_height;
                                          
          $center $rest1/2;
                                          
          $perfectmidheight $new_height/2;
                                           
          // create a new temporary image with backgroundcolor
                                          
          $tmp_img imagecreatetruecolor8892 );
                                          
          $background imagecolorallocate($tmp_img250248247);
                                          
          // transparent png 
                                          
          $watermark imagecreatefrompng('template/images/icons/devicons/Planet.png');
                                          
          imagealphablending($watermarktrue); // setting alpha blending on
                                          
          imagesavealpha($watermarktrue); // save alphablending setting (important)
              
                                          
          $watermark_size getimagesize($watermark);
                                          
                                          
          imagefilledrectangle($tmp_img0088 192 1$background);
                                  
                                            
          // copy and resize old image into new image
                                          
          imagecopyresized$tmp_img$img0$center00$new_width$new_height$width$height );
                                          
          imagecopyresized$tmp_img$watermark30$perfectmidheight0032323232 );
                                            
          // save thumbnail into a file
                                                
          imagejpeg$tmp_img$move_to60 );
                                             
          #imagegif($tmp_img, $move_to);
                                            //free ram
                                            
          imagedestroy($img);
                                            
          imagedestroy($watermark);
                                            
                                            return 
          true;
                                      }
          # spaeter im code:
          if(create_photo_thumb($_FILES['image']['tmp_name'], $thumbpath'88')) { 
                                  echo 
          substr($image,0,$extensionlen) .'wurde hochgeladen.'
                              } 

          Kommentar


          • #6
            Zitat von awak3 Beitrag anzeigen
            PHP-Code:
                                            if($width >= $height) {
                                                  
            // calculate thumbnail size
                                            
            $new_width $thumbWidth;
                                                
            $new_height floor$height * ( $thumbWidth $width ) );
                                              
            // calculate picture position
                                            
            $rest1 92-$new_height;
                                            
            $center $rest1/2;
                                            
            $perfectmidheight $new_height/2;
                                             
            // create a new temporary image with backgroundcolor
                                            
            $tmp_img imagecreatetruecolor8892 );
                                            
            $background imagecolorallocate($tmp_img250248247);
                                            
            // transparent png 
                                            
            $watermark imagecreatefrompng('template/images/icons/devicons/Planet.png');
                                            
            imagealphablending($watermarktrue); // setting alpha blending on
                                            
            imagesavealpha($watermarktrue); // save alphablending setting (important)
                
                                            
            $watermark_size getimagesize($watermark);
                                            
                                            
            imagefilledrectangle($tmp_img0088 192 1$background);
                                    
                                              
            // copy and resize old image into new image
                                            
            imagecopyresized$tmp_img$img0$center00$new_width$new_height$width$height );
                                            
            imagecopyresized$tmp_img$watermark30$perfectmidheight0032323232 );
                                              
            // save thumbnail into a file
                                                  
            imagejpeg$tmp_img$move_to60 );
                                               
            #imagegif($tmp_img, $move_to);
                                              //free ram
                                              
            imagedestroy($img);
                                              
            imagedestroy($watermark);
                                              
                                              return 
            true;
                                        } 
            Also wenn ich mich jetzt nicht verguckt hab: Wo ist der else-Zweig?
            Der ganze Code wird nur für den Fall "Breite größergleich Höhe" ausgeführt...

            Kommentar


            • #7
              Zitat von lstegelitz Beitrag anzeigen
              Also wenn ich mich jetzt nicht verguckt hab: Wo ist der else-Zweig?
              Der ganze Code wird nur für den Fall "Breite größergleich Höhe" ausgeführt...
              Natuerlich war das der Fehler. Mein Gott..

              Vielen dank!

              Kommentar

              Lädt...
              X