Codeschnipsel
Bild verkleinern (JPEG/PNG/GIF)
Alternativ existiert noch direkt ein Codeschnipsel für Thumbnails
Angeregt durch eine Anfrage von Mr. Apple und da ich gesehen habe, dass es hier noch keinen all-umfassende Bildverkleinerungs-Code gibt, habe ich nachfolgende Funktion entwickelt und stelle sie euch hier zur freien Verfügung.
Funktionsbeschreibung
Die nachfolgende PHP-Funktion verkleinert oder vergrößert ein auf dem Webserver gespeichertes Bild. Die Funktion ist dabei auf alle im Web gebräuchlichen Bildformate (GIF, PNG, JPEG) anwendbar. Typischer Anwendungsfall ist die Erstellung von Vorschaubildern (Thumbnails).
Funktionsparameter
Der Pfad, unter dem das Bild zu finden ist, welches als Vorlage dienen soll, wird mit $filepath_old übergeben, der Pfad, unter dem das neue, verkleinerte resp. vergrößerte Bild gespeichert werden soll, wird mit $filepath_new übergeben. Mit $image_dimension wird ein ganzzahliger Pixelwert übergeben, dessen Bedeutung erst durch $scale_mode definiert wird. Die möglichen Werte für diesen Parameter sind:
-1: $image_dimension wird als neue Breite des Bildes aufgefasst; die Höhe wird so angepasst, dass das Seitenverhältnis des Bildes erhalten bleibt. Ideal, wenn das Bild in eine Spalte mit fester Breite eingefügt werden soll.
-2: $image_dimension wird als neue Höhe des Bildes aufgefasst; die Breite wird so angepasst, dass das Seitenverhältnis des Bildes erhalten bleibt. Ideal, wenn das Bild in eine Zeile mit fester Höhe eingefügt werden soll.
0: [Standardwert] $image_dimension wird als neue längste Seite des Bildes aufgefasst. Die andere Seite wird entsprechend verkleinert, damit das Seitenverhältnis des Bildes erhalten bleibt. Ideal, wenn das Bild in eine quadratische Box mit fester Größe eingepasst werden soll (typisch für eine Thumbnail-Übersicht).
1: $image_dimension wird als neue kürzeste Seite des Bildes aufgefasst. Die andere Seite wird entsprechend vergrößert, damit das Seitenverhältnis des Bildes erhalten bleibt. Ideal, wenn das Bild eine Mindestgröße nicht unterschreiten soll.
|
Erläuterungen zum Quellcode
In Zeile 4 wird zunächst überprüft, ob überhaupt eine Datei unter dem angegebenen Dateipfad existiert und ob unter dem neuen Dateipfad nicht schon eine Datei vorhanden ist (diese würde sonst überschrieben). Will man ein Überschreiben zulassen, entfernt man einfach den zweiten Teil der Bedingung.
In den Zeilen 6-9 ermitteln wir die Attribute des Bildes, welches wir anschließend verkleinern resp. vergrößern wollen. In Zeile 11 checken wir noch kurz, ob wir als Breite und Höhe sinnvolle Werte ermitteln konnten (ist die Datei versehentlich gar keine gültige Bilddatei, ist hier 0 zu erwarten, was bei den nachfolgenden Berechnungen zu einer Reihe von Fehlern führen würde. Und schließlich berechnene wir in Zeile 12 das Seitenverhältnis des Bildes (Breite:Höhe).
In den Zeilen 14-18 bestimmen wir abhänging von (positiven) $scale_mode und vom Seitenverhältnis des Bildes, ob wir $image_dimension als neue Breite (-1) oder neue Höhe (-2) auffassen müssen. Dies wird dann in den Zeilen 20-28 umgesetzt, wobei sich der jeweils andere Wert aus einer Berechnung mit $image_aspectratio ergibt. Dieser muss natürlich gerundet werden, da wir keine halben Pixel erzeugen können.
In den Zeilen 30-53 findet dann die eigentliche Verkleinerung des Bildes statt. Das Grundprinzip ist hier jeweils gleich: man erstelle ein Bildobjekt aus der Originaldatei und ein neues, leeres Bildobjekt, man kopiere das Original-Bildobjekt in der Größe angepasst in das neue Bildobjekt und speichere das neue Bildobjekt. Je nach Bildformat gibt es jedoch feine Unterschiede. GIF unterstützt nur 256 Farben, weshalb wir hier per imagecreate nur ein Palettenfarben-Bild erstellen dürfen, im Gegensatz zu JPEG, wo wir mit imagecreatetruecolor ein Echtfarben-Bild erzeugen. Besonders kompliziert wird es bei PNG, da sich dahinter sowohl ein Palettenfarben-Bild, als auch ein Echtfarben-Bild verbergen kann, was wir über die Bestimmung der Farbtiefe auswerten. Wir könnten auch immer ein Echtfarben-Bild erzeugen, welches uns stets optimale Bildqualitäten garantieren würde (bei der Verkleinerung kommen durch Mittelwertbildung häufig zusätzliche Farben dazu für die dann u.U. kein Platz mehr in der Palette ist), doch die Dateigröße schießt dabei in der Regel gigantisch in die Höhe. Außerdem müssen wir noch den Alpha-Kanal in PNG-Bildern berücksichtigen, wenn wir auch Bilder mit transparenten Flächen korrekt verkleinern wollen.
Zuletzt entfernen wir in den Zeilen 65-66 die Bildobjekte aus dem Speicher. Ordnung muss sein. 😉
Anmerkung
Ich habe diese allgemeine Funktion aus einer meiner stärker spezialisierten Funktionen entwickelt und noch nicht selbst getestet. Daher könnten sich noch Schreib- oder Logikfehler in dem Skript befinden. Sollte dir ein solcher Fehler auffallen, wäre ich um eine Rückmeldung dankbar.
Kommentare
Autor Thoro