Thumbnail-Script --> versch. Dateiformate unterstützen?
marcel_reuter
- php
0 Felix Riesterer0 Tom0 Thomas Luethi0 Tom0 Thomas Luethi0 Tom
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
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.
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
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.
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
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
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
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
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
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