Probleme mit Thumbnail-Erstellung (GD)
Fabian St.
- php
Hi!
Ich bin gerade dabei, meine ersten Gehversuche mit der GD-Library von PHP zu machen. Da ich mich mit den ganzen Grafikfunktionen - wie gesagt - noch nicht auskenne, habe ich nach solchen Thumbnail-Scripte gesucht und versucht ihre Funktionsweise zu verstehen. Leider klappt dabei nicht alles wie gewünscht.
In einem Verzeichnis befinden sich ca. 100 800x600px große Bilder im JPG-Format. Dies werden von einem Skript ausgelesen und der Dateiname in einem numerisch-indizierten Array gespeichert. Anschließend wird dieses Array von einer foreach-Schleife durchlaufen und es soll bei jedem Schleifendurchlauf _dynamisch_ ein Thumbnail erstellt werden, das jedoch sofort nach der Ausgabe wieder gelöscht wird. Das Problem nun ist, dass
a) einerseits die Qualität der Thumbnails bescheiden ist, d.h. meist schwarz-weiß; Beispiel: http://klasse10a.fabis-site.net/
b) ich nicht genau weiß, wie ich es am besten anstellen soll, die Thumbnails nach der Ausgabe zu löschen
c) ich nicht ganz hinter den Sinn des Codes blicke :-(
Der Code zur Erstellung der Thumbnails lässt sich hier finden. Ich würde mich freuen, wenn mir jemand die obigen Fragen beantworten könnte und was es mit den Funktionen ImageCreateFromJPEG, ImageJPEG, ImageCreate auf sich hat. Ich habe sie zwar bereits in php.net nachgeschlagen, jedoch verstehe ich z.B. den Sinn nicht, warum man mit ImageCreateFromJPEG ein neues Bild im JPEG-Format erstellen soll, obwohl man es bereits vorliegen hat?!
Grüße,
Fabian St.
Hallo Fabian,
da du dich ja ein wenig mit Linux auskennst mein Tipp:
Via GD Library Thumbnails zu erstellen ist sehr belastend für den Server, und die Qualität der Thumbnails ist meist sehr schlecht.
Wesentlich besser (und schneller!) lässt es sich mit ImageMagick unter Linux machen, laut
[http://www.easylinux.de/Artikel/ausgabe/2004/01/069-shell-tipps]
erstellst du einfach ein Shell-Skript mit folgendem Inhalt:
---schnipp---
#!/bin/bash
for bild in *.jpg
do
convert "$bild" -resize 240x240 "${bild%.jpg}_thumb.jpg"
done
---schnapp---
Damit werden alle *.jpg-Dateien im Ordner verkleinert und als *_thumb.jpg abgespeichert. Alle erstellten Thumbnails haben dann eine _maximale_ Breite von 240 und eine maximale Höhe von 240 Pixeln.
Schneller und einfacher geht's wohl nicht... :-D
Bis dann!
Marc Reichelt || http://www.marcreichelt.de/
Hi Marc!
da du dich ja ein wenig mit Linux auskennst mein Tipp:
Via GD Library Thumbnails zu erstellen ist sehr belastend für den Server, und die Qualität der Thumbnails ist meist sehr schlecht.
Ja, das habe ich auch bemerkt :-)
Wesentlich besser (und schneller!) lässt es sich mit ImageMagick unter Linux machen, laut
http://www.easylinux.de/Artikel/ausgabe/2004/01/069-shell-tipps
erstellst du einfach ein Shell-Skript mit folgendem Inhalt:
---schnipp---
#!/bin/bashminijpg: Erstellt Thumbnails von jpg-Dateien
for bild in *.jpg
do
convert "$bild" -resize 240x240 "${bild%.jpg}_thumb.jpg"
done
---schnapp---
Das Skript kenne ich bereits, da du es nämlich schon einmal gepostet hast und ich habe es sogleich in meiner persönliche Skript-Sammlung archiviert ;-)
Damit werden alle *.jpg-Dateien im Ordner verkleinert und als *_thumb.jpg abgespeichert. Alle erstellten Thumbnails haben dann eine _maximale_ Breite von 240 und eine maximale Höhe von 240 Pixeln.
Schneller und einfacher geht's wohl nicht... :-D
Wahrscheinlich nicht, da hast du recht. Mir gings eben auch insbesondere darum, mich näher mit diesen Grafikfunktionen zu beschäftigen und als ein erster Schritt hierzu erschien mir die Erstellung einer kleinen Gallery, die automatisch Thumbnails generiert.
Ich würde mir auch weiterhin wünschen, es irgendwie funktionierend hinzubekommen. Kannst du mir vielleicht den oben geposteten Codeausschnitt erklären (der zwischen beiden Kommentaren)?
Grüße,
Fabian St.
Moin!
Via GD Library Thumbnails zu erstellen ist sehr belastend für den Server, und die Qualität der Thumbnails ist meist sehr schlecht.
Ich möchte einfach mal der urban legend widersprechen, dass die gdlib nur schlechte Thumbnails produzieren kann. Das stimmt so einfach nicht. Man kann bei der Erstellung Mist machen, oder man leidet unter unzureichenden Fähigkeiten veralteter gdlib-Versionen, aber das wären dann jeweils Einzelfälle, es gilt nicht für die Allgemeinheit.
Wesentlich besser (und schneller!) lässt es sich mit ImageMagick unter Linux machen,
ImageMagick wird die Konvertierung auch nicht wesentlich schneller oder entlastender hinkriegen, als ein PHP-Skript mit gdlib - die relevanten Codeteile sind in beiden Fällen in C geschrieben.
Man kann es mit beiden Methoden "richtig" machen (indem man die Ergebnisse cachet und nicht ständig neu erstellt), und man kann es mit beiden Methoden falsch machen.
- Sven Rautenberg
Hallo Sven,
Via GD Library Thumbnails zu erstellen ist sehr belastend für den Server, und die Qualität der Thumbnails ist meist sehr schlecht.
Ich möchte einfach mal der urban legend widersprechen, dass die gdlib nur schlechte Thumbnails produzieren kann. Das stimmt so einfach nicht. Man kann bei der Erstellung Mist machen, oder man leidet unter unzureichenden Fähigkeiten veralteter gdlib-Versionen, aber das wären dann jeweils Einzelfälle, es gilt nicht für die Allgemeinheit.
Ich habe mit der GD Library noch nie so schöne Thumbnails erstellen können, vielleicht kannst du mir ein Codebeispiel geben, wo die Bilder nicht so verpixelt aussehen? Bei mir hat es nie richtig (nicht verpixelt) funktioniert, dabei hatte ich ein Original-Skript von php.net.
Wesentlich besser (und schneller!) lässt es sich mit ImageMagick unter Linux machen,
ImageMagick wird die Konvertierung auch nicht wesentlich schneller oder entlastender hinkriegen, als ein PHP-Skript mit gdlib - die relevanten Codeteile sind in beiden Fällen in C geschrieben.
Du hast Recht! Ich meinte damit auch eher dass man die Thumbnails mit ImageMagick (oder GD Library, wer möchte) auf seinem eigenen PC erstellen sollte, um dem _Server_ dann die lästigen Grafikoperationen zu ersparen. ;-)
Und mit dem Geschwindigkeitsvorteil meinte ich die Einfachheit des Shell-Skripts [ImageMagick] gegenüber des PHP-Skripts [GD-Library].
Das ist doch ein wenig kürzer, einfacher und führt schnell zum Erfolg.
Man kann es mit beiden Methoden "richtig" machen (indem man die Ergebnisse cachet und nicht ständig neu erstellt), und man kann es mit beiden Methoden falsch machen.
Stimmt, ich hatte auch erst zum Erstellen von Thumbnails die Thumbnail-Methode von ImageMagick genommen, die zwar wesentlich schneller ist, aber ähnlich verpixelte Bilder erzeugt wie die GD Library bei Fabian.
Allerdings hatte ich dann bei ImageMagick sofort den rettenden Einfall, und bei der GD Library habe ich (obwohl ich mich damit länger beschäftigt habe als mir ImageMagick) nie so schöne Thumbnails.
Bis dann!
Marc Reichelt || http://www.marcreichelt.de/
Hallo Fabian,
ich versuche nun doch mal ein wenig, deinen Code auseinanderzunehmen.
Hatte selbst mal probiert via PHP Thumbnails zu erstellen, es hat auch geklappt - wenn auch schlecht, weshalb ich heute ImageMagick verwende.
Nun aber zu deinem Problem:
Ich bin gerade dabei, meine ersten Gehversuche mit der GD-Library von PHP zu machen. Da ich mich mit den ganzen Grafikfunktionen - wie gesagt - noch nicht auskenne, habe ich nach solchen Thumbnail-Scripte gesucht und versucht ihre Funktionsweise zu verstehen. Leider klappt dabei nicht alles wie gewünscht.
In einem Verzeichnis befinden sich ca. 100 800x600px große Bilder im JPG-Format. Dies werden von einem Skript ausgelesen und der Dateiname in einem numerisch-indizierten Array gespeichert. Anschließend wird dieses Array von einer foreach-Schleife durchlaufen und es soll bei jedem Schleifendurchlauf _dynamisch_ ein Thumbnail erstellt werden, das jedoch sofort nach der Ausgabe wieder gelöscht wird. Das Problem nun ist, dass
a) einerseits die Qualität der Thumbnails bescheiden ist, d.h. meist schwarz-weiß; Beispiel: http://klasse10a.fabis-site.net/
Die Qualität von verkleinerten Bildern unter GD-Library ist meist sehr schlecht, dass einige Bilder schwarz-weiß erscheinen habe ich aber noch nicht erlebt.
Vielleicht stellst du auch mal die Bilder in Originalgröße online, zum Vergleichen?
b) ich nicht genau weiß, wie ich es am besten anstellen soll, die Thumbnails nach der Ausgabe zu löschen
Ich hätte ein PHP-Skript erstellt, dass später als Bild eingebunden wird.
Dieses nimmt das Originalbild, verkleinert es und gibt es als Bild an den Browser aus (fpassthru()-Funktion). Da kommt man auch nicht in die Problemsituation, die du jetzt hast - das ist nämlich nicht möglich, denn dazu müsstest du über PHP feststellen dass das Bild vom Browser geladen wurde.
c) ich nicht ganz hinter den Sinn des Codes blicke :-(
Der Code zur Erstellung der Thumbnails lässt sich hier finden. Ich würde mich freuen, wenn mir jemand die obigen Fragen beantworten könnte und was es mit den Funktionen ImageCreateFromJPEG, ImageJPEG, ImageCreate auf sich hat. Ich habe sie zwar bereits in php.net nachgeschlagen, jedoch verstehe ich z.B. den Sinn nicht, warum man mit ImageCreateFromJPEG ein neues Bild im JPEG-Format erstellen soll, obwohl man es bereits vorliegen hat?!
Soweit ich noch von damals weiß kann man mit der GD-Library nur Bilder einer festen Größe anlegen, verändern kann man die gesamte Bildgröße nicht.
Mit der Funktion ImageCopyResized kann man zumindest einen Bildausschnitt (hier das gesamte Bild) kopieren und in einem anderen Bild mit anderer Größe ablegen (das via ImageCreate erstellt wurde).
Sinnvoll wäre es wirklich, wenn die GD-Library eine Funktion zur Größenveränderung des gesamten Bildes gäbe - gibt es aber AFAIK nicht.
Mittels der Funktion ImageJPEG wird das Bild dann als Datei auf die Platte geschrieben.
So verstanden? Dann weißt du jetzt sicher auch warum ich am Liebsten ImageMagick verwende... ;-)
Marc Reichelt || http://www.marcreichelt.de/
Hi Marc!
Hallo Fabian,
ich versuche nun doch mal ein wenig, deinen Code auseinanderzunehmen.
Hatte selbst mal probiert via PHP Thumbnails zu erstellen, es hat auch geklappt - wenn auch schlecht, weshalb ich heute ImageMagick verwende.
Ich glaube, du hast mich überzeugt - mittlerweile versuche ich mich schon seit drei Tagen daran. Langsam habe ich keine Lust...
Die Qualität von verkleinerten Bildern unter GD-Library ist meist sehr schlecht, dass einige Bilder schwarz-weiß erscheinen habe ich aber noch nicht erlebt.
Vielleicht stellst du auch mal die Bilder in Originalgröße online, zum Vergleichen?
Also hier mal zwei zum Vergleichen:
Orginal: http://klasse10a.fabis-site.net/silvester04(6).JPG (86kB)
Thumbnail: http://klasse10a.fabis-site.net/thumb_silvester04(6).JPG
In diesem Beispiel sind sie zwar nicht schwarz-weiß, aber das die Farben wohl nicht stimmen, sieht man deutlich. Bei vielen anderen Bilder ist es sogar noch schlimmer.
b) ich nicht genau weiß, wie ich es am besten anstellen soll, die Thumbnails nach der Ausgabe zu löschen
Ich hätte ein PHP-Skript erstellt, dass später als Bild eingebunden wird.
Dieses nimmt das Originalbild, verkleinert es und gibt es als Bild an den Browser aus (fpassthru()-Funktion). Da kommt man auch nicht in die Problemsituation, die du jetzt hast - das ist nämlich nicht möglich, denn dazu müsstest du über PHP feststellen dass das Bild vom Browser geladen wurde.
Achso, du meinst also ich soll ein PHP-Script schreiben, das gleich als Content-Type image/jpeg zurück liefert und das jeweilige Bild, als GET-Paramter überliefert kriegt - keine schlechte Idee ;-)
c) ich nicht ganz hinter den Sinn des Codes blicke :-(
Soweit ich noch von damals weiß kann man mit der GD-Library nur Bilder einer festen Größe anlegen, verändern kann man die gesamte Bildgröße nicht.
Mit der Funktion ImageCopyResized kann man zumindest einen Bildausschnitt (hier das gesamte Bild) kopieren und in einem anderen Bild mit anderer Größe ablegen (das via ImageCreate erstellt wurde).
Sinnvoll wäre es wirklich, wenn die GD-Library eine Funktion zur Größenveränderung des gesamten Bildes gäbe - gibt es aber AFAIK nicht.
Mittels der Funktion ImageJPEG wird das Bild dann als Datei auf die Platte geschrieben.
Vielen Dank für deine Erklärung, Marc! Ohne diese Sachverhalt zu wissen, kann man ja lange grübeln, um auf die Lösung zu kommen.
So verstanden? Dann weißt du jetzt sicher auch warum ich am Liebsten ImageMagick verwende... ;-)
Ja und ich glaube, dass ich es auch machen werden :-)
Grüße,
Fabian St.