marcel_reuter: Thumbnail-Script --> versch. Dateiformate unterstützen?

Hallo!

Ich habe ein Problem mit einem Thumbnail-Script. Es liest aus einem Ordner alle Dateien mit .jpeg-Endung, macht aus diesen eine Vorschau (Thumbnail), und speichert sie unter dem Ordner .../galerien/GALERIENAME/thumbs/thumb.jpg ab. Die großen Bild-Dateien werden im Ordner .../galerien/GALERIENAME/images/ gespeichert!
Das Script funktioniert mit den vorgegebenen Bildern, aber nicht mit meinen eigenen. Ich erhalte folgende Fehlermeldungen:

-------------------------------------------
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error: in ...\Galerie\thumb_erstellen.php on line 11

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 'bild1.jpg' is not a valid JPEG file in ...\Galerie\thumb_erstellen.php on line 11

Warning: imagecopy(): supplied argument is not a valid Image resource in ...\Galerie\thumb_erstellen.php on line 17
-------------------------------------------

Folgendes Script verwende ich:

  
<?php  
  
function qThumb( $Bild, $ThumbKantenLaenge )  
{  
	// Masse ermitteln  
	$OriginalBildInfo   = getimagesize( $Bild );  
	$OriginalBildBreite = $OriginalBildInfo[0];  
	$OriginalBildHoehe  = $OriginalBildInfo[1];  
	$OriginalKantenLaenge = $OriginalBildBreite < $OriginalBildHoehe ? $OriginalBildBreite : $OriginalBildHoehe;  
	// Temporaeres Bild vom Original erzeugen  
	$TempBild = imagecreatefromjpeg( $Bild ); <-- line 11  
	// Neues Bild erstellen  
	$NeuesBild = imagecreatetruecolor( $OriginalKantenLaenge, $OriginalKantenLaenge );  
	// Originalbild in neues Bild einfügen  
	if ($OriginalBildBreite > $OriginalBildHoehe)  
	{  
		imagecopy( $NeuesBild, $TempBild, 0, 0, round( $OriginalBildBreite-$OriginalKantenLaenge )/2, 0, $OriginalBildBreite, $OriginalBildHoehe );  
	}  
	else if ($OriginalBildBreite <= $OriginalBildHoehe )  
	{  
		imagecopy( $NeuesBild, $TempBild, 0, 0, 0, round( $OriginalBildHoehe-$OriginalKantenLaenge )/2, $OriginalBildBreite, $OriginalBildHoehe );  
	}  
	  
	$Thumbnail = imagecreatetruecolor( $ThumbKantenLaenge, $ThumbKantenLaenge );  
	imagecopyresampled( $Thumbnail, $NeuesBild, 0, 0, 0, 0, $ThumbKantenLaenge, $ThumbKantenLaenge, $OriginalKantenLaenge, $OriginalKantenLaenge );  
	// Neues Bild ausgeben  
	imagejpeg( $Thumbnail, "../thumbs/".$Bild, 80 );  
	imagedestroy( $Thumbnail );  
}  
  
// Funktionsaufruf  
$galerie_name = "galerie1";  
chdir("galerien/".$galerie_name."/images");  
foreach (glob( "*.jpeg" ) as $Bild)  
{  
	qThumb( $Bild, 90 );  
}  
  
?>  

Offensichtlich liegt es daran, dass das Script beim Unterscheid zwischen 'jpg' und 'jpeg' meckert.
Hat jemand eine Lösung, wie ich mehrere Formate außer nur 'jpeg' (also auch 'jpg', am besten noch 'bmp' und 'png') verarbeiten kann?
Danke für jede Hilfe!

Marcel

  1. Lieber marcel_reuter,

    vielleicht sind Deine JPG-Dateien nicht wirklich im jpg-Format sondern _heißen_ nur so...?

    Ich habe meine Thumbnail-Funktion so ausgerüstet, dass Sie anhand der Dateiendung (und ich deutete gerade an, dass das im Zweifelsfalle ungenügend ist) die entsprechende PHP-Funktion aufruft:

    // Bilddatei ausmessen  
    $bildtyp = strtolower(preg_replace('~.*\.([^.]+)$~', '\\1', $bildpfad));  
    $bilddimensionen = getimagesize($bildpfad);  
    $originalx = $bilddimensionen[0];  
    $originaly = $bilddimensionen[1];  
      
    switch ($bildtyp) {  
        case 'jpg':  
        case 'jpeg':  
            $bild = imagecreatefromjpeg($bildpfad);  
        break;  
      
        case 'gif':  
            $bild = imagecreatefromgif ($bildpfad);  
        break;  
      
        case 'png':  
            $bild = imagecreatefrompng($bildpfad);  
        break;  
      
        default:  
            $bild = imagecreatetruecolor($maxx, $maxy);  
    }
    

    Vielleicht bringt Dich mein Code auf neue Gedanken?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo Felix,

      Dein Code ist sicher mal ein sehr guter Ansatz.
      Aber statt sich auf den - wie Du selbst sagst - sehr unsicheren
      Dateinamen zu verlassen, könnte man doch gleich mit PHP den
      Dateityp der Grafik bestimmen. Beim Resultat von getimagesize()
      steht ja der Bildtyp im Element mit dem Index "mime".
      Darum würde ich Deinen Code wie folgt anpassen:

      // Bilddatei ausmessen

      $bilddimensionen = getimagesize($bildpfad);
      $originalx = $bilddimensionen[0];
      $originaly = $bilddimensionen[1];

      // Typ bestimmen:
      $bildtyp=$bilddimensionen['mime'];

      switch ($bildtyp) {
          case 'image/jpeg':
              $bild = imagecreatefromjpeg($bildpfad);
          break;

      case 'image/gif':
              $bild = imagecreatefromgif ($bildpfad);
          break;

      case 'image/png':
              $bild = imagecreatefrompng($bildpfad);
          break;

      default:
              $bild = imagecreatetruecolor($maxx, $maxy);
      }

        
      Es kommt ja gelegentlich vor, dass eine Datei eine falsche  
      Endigung hat. Das Grafik-Betrachtungsprogramm [IrfanView](http://www.irfanview.com/)  
      (Freeware für Windows) gibt dann jeweils eine Warnung aus  
      im Stil: "xyz.gif ist eine JPEG-Datei mit falscher Endigung.  
      Soll die Datei umbenannt werden? Ja / Nein."  
      Sehr praktisch.  
        
      Freundliche Grüsse  
      Thomas
      
      1. Lieber Thomas,

        vielen Dank für diesen wertvollen Hinweis! Meine Funktion sieht an diskutierter Stelle nun so aus:

        // Bilddatei ausmessen  
        $bilddimensionen = getimagesize($bildpfad);  
        $bildtyp = $bilddimensionen['mime'];  
        $originalx = $bilddimensionen[0];  
        $originaly = $bilddimensionen[1];  
          
        switch ($bildtyp) {  
            case 'image/jpeg':  
                $bild = imagecreatefromjpeg($bildpfad);  
            break;  
          
            case 'image/gif':  
                $bild = imagecreatefromgif ($bildpfad);  
            break;  
          
            case 'image/png':  
                $bild = imagecreatefrompng($bildpfad);  
            break;  
          
            case 'image/xbm':  
                $bild = imagecreatefromxbm($bildpfad);  
            break;  
          
            case 'image/vnd.wap.wbmp':  
                $bild = imagecreatefromwbmp($bildpfad);  
            break;  
          
            default:  
                $bild = imagecreatetruecolor($maxx, $maxy);  
        }
        

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    2. Hallihallo!

      vielleicht sind Deine JPG-Dateien nicht wirklich im jpg-Format sondern _heißen_ nur so...?

      Ich habe meine Thumbnail-Funktion so ausgerüstet, dass Sie anhand der Dateiendung (und ich deutete gerade an, dass das im Zweifelsfalle ungenügend ist) die entsprechende PHP-Funktion aufruft:

      // Bilddatei ausmessen

      $bildtyp = strtolower(preg_replace('~.*.([^.]+)$~', '\1', $bildpfad));
      $bilddimensionen = getimagesize($bildpfad);

      Um das Ganze zu ergänzen, würde ich an dieser Stelle gern darauf hinweisen, dass die Funktion [link:http://de.php.net/manual/de/function.getimagesize.php@title=getimagesize], die hier ja sowieso aufgerufen wird, auch den Content-Type der Bilddatei zurückgibt:

      [code lang=php]
      $size = getimagesize($bildpfad);
      $ContentType = $size['mime'];  // z.B. "image/jpeg"

        
      Beste Grüße,  
         Tobias Hahner
      
  2. Hello,

    wenn Du genügend Hauptspeicher zur Verfügung hast, dann kannst Du
    http://de.php.net/manual/de/function.imagecreatefromstring.php
    benutzen. Die Funktion erkennt das Dateiformat automatisch

    Dazu musst Du die Datei aber vorher selber einlesen, z.B. mit
    http://de.php.net/manual/de/function.file-get-contents.php
    oder besser noch der Kombination aus
    http://de.php.net/manual/de/function.fopen.php
    http://de.php.net/manual/de/function.flock.php
    http://de.php.net/manual/de/function.fread.php
    http://de.php.net/manual/de/function.fclose.php

    vorher kannst Du aber die Größe und das Format des Bildes auch bestimmen lassen mit
    http://de.php.net/manual/de/function.getimagesize.php und ausrechnen, ob es denn noch in den Speicher passen würde.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo Tom,

      imagecreatefromstring ()

      Aha, wieder mal was dazugelernt! ;-)

      Dazu musst Du die Datei aber vorher selber einlesen, z.B. mit file_get_contents()
      oder besser noch der Kombination aus fopen(), flock(), fread(), fclose()

      Warum soll _hier_ der umständliche Weg mit den 4 Funktionen besser
      sein als der einfache Weg mit der einen Funktion?
      (Ich weiss, dass Du bei _schreibenden_ Prozessen immer sehr viel
      Wert auf das File Locking legst, aber hier geht es ja nur ums Lesen.)

      Grüsse aus der schönen spätsommerlichen Schweiz
      Thomas

      1. Hello,

        Dazu musst Du die Datei aber vorher selber einlesen, z.B. mit file_get_contents()
        oder besser noch der Kombination aus fopen(), flock(), fread(), fclose()

        Warum soll _hier_ der umständliche Weg mit den 4 Funktionen besser
        sein als der einfache Weg mit der einen Funktion?
        (Ich weiss, dass Du bei _schreibenden_ Prozessen immer sehr viel
        Wert auf das File Locking legst, aber hier geht es ja nur ums Lesen.)

        Beim Lesen sollte man das auch berücksichtigen, wenn man keine Fehler provozieren will. Es könnte ja sonst sein, dass ein anderer Prozess die Datei zwischenzeitlich ändert.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom,

          Beim Lesen sollte man das auch berücksichtigen, wenn man keine Fehler provozieren will. Es könnte ja sonst sein, dass ein anderer Prozess die Datei zwischenzeitlich ändert.

          Zwischen was und was?

          LG, Thomas

          1. Hello,

            Beim Lesen sollte man das auch berücksichtigen, wenn man keine Fehler provozieren will. Es könnte ja sonst sein, dass ein anderer Prozess die Datei zwischenzeitlich ändert.

            Zwischen was und was?

            Das weiß man ja in nebenläufigen Anwendungen, die zudem auch noch Multi-User-fähig sein sollen selten genau.

            Und ein shared Lock zu setzen und zu prüfen, ob es erteilt wurde, ist eben einfach sauberer, wenn die Daten weiterverarbeitet und nicht nur einfach an irrelevante User ausgegeben werden wollen.

            Wenn der User sich aber darauf verlassen können soll, dass die angeforderten Daten vollständig und richtig sind, ist ein sauberes Verfügbarkeitsmanagement eigentlich selbstverständlich.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de