yubb.de-Logo
Tutorials
yubb@yubb
yubbService
Inside yubb

Mit PHP serverschonend Thumbnails erstellen



Ich bin mir im klaren darüber, dass Phil Marx bereits ein Tutorial "Mit PHP Thumbnails erstellen" geschrieben hat, dieses ist jedoch anders. Denn folgnde Funktion verkleinert ein Bild und speichert es auf dem Server, sodass die Thumbnails nicht bei jedem Aufruf der Seite generiert werden müssen und dadurch der Server nicht übermäßig überlastet wird.

PHP-Datei:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
function make_thumb($img_src$img_width$img_height$des_src$quali 100) {
    
$im imagecreatefromjpeg($img_src);
    list(
$src_width$src_height) = getimagesize($img_src);
    if(
$src_width >= $src_height) {
        
$new_image_width $img_width;
        
$new_image_height $src_height $img_width $src_width;
    }
    if(
$src_width $src_height) {
        
$new_image_height $img_width;
        
$new_image_width $src_width $img_height $src_height;
    }
    
$new_image imagecreatetruecolor($new_image_width$new_image_height);
    
imagecopyresampled($new_image$im0000$new_image_width,$new_image_height$src_width$src_height);
    
imagejpeg($new_image$des_src$quali);
}
?>


gehen wir als erstes mal die Parameter der Funktion durch:
$img_src ist der Pfad zu dem Bild, aus welchem das Thumbnail erzeugt werden soll. $img_width[/i[ ist die Breite, [i]$img_height die Höhe des Thumbnails. $des_src gibt den Pfad an, wo das Thumbnail gespeichert werden soll, der Optionale Parameter $quali (int <= 100) ist für die Qualität der Thumbnail zuständig und dadurch auch für die Größe des Thumbnails.

Nun zu der Funktionsweise der Funktion:
als erstes wollen wir das Originalbil laden, mit
imagecreatefromjpeg(). Dann bestimmen wir Höhe und Breite des Originalbildes. Diese sind dann für den nächsten schritt nötig, denn in diesem wird die Größe des Thumbnails bestimmt. Und beim Verkleinern werden auch die Proportionen beibehaten.. Wir erstellen ein neues Bild (das Thumbnail) und tun auf dieses den Inhalt des Originalbildes mit imagecopyresampled() "kopieren". Am Ende der Funktion wird mit imagejpeg() nicht ein Bild im JPG Format ausgegeben sondern (auf den Server) gespeichert.

Der Aufruf der Funktion sieht wie folgt aus:
PHP-Datei:
1
2
3
<?php
make_thumb
("example_large.jpg"10075"example_thumb.jpg"80);
?>

richtig praktisch ist sowas, wenn man die Besucher bilder hochladen lässt, und sich jeder diese ansehen kann (sprich bei einer Galerie).

Anmerkung:
Diese Funktion wird ausschließlich mit Bildern im JPG Format funktionieren, da man von PNGs selten Thumbnails braucht und man keine GIF Bilder mehr mit der GD Lib >= 2.0 erstellen kann.

Geschrieben von michi am 18.06.2004 (13004x gelesen)
weiterempfehlen weiterempfehlen   Druckversion Druckversion   kommentieren kommentieren

ich würde so eine Funktion ggf. anders bauen ...



bei jedem Aufruf der Seite frage ich nach, ob die Vorschau schon vorhanden ist, wenn nicht, generiert er es live ...



somit hat nur der erste eine Zeitverzögerung - aber der ist man meistens selber. Gehen die Vorschaubilder einmal verloren, werden sie wieder neu generiert
Geschrieben von René
naja, das kannst du ja selber einbauen. Hier habe ch nur die Funktion dazu erklärt. Wie diese dann letztendlich genutzt wird ist jedem selbst überlassen. Ich persönlich nutze sie in einer Galerie, die Thumbs werden beim Einstellen (hochladen) eines neuen Bildes erstellt..
Geschrieben von michi
bei mir gehts nicht. hab zwar keine fehlermeldung. aber ein thumbnail erstellt er auch nicht. komisch. des gdlib-2 hab ich schon. denk ich mal.
bei phpinfo hab ich das stehen
GD Version bundled (2.0.15 compatible)
sollte also passen oder?
Geschrieben von Schnof
muss ich immer die breite höhe usw alleine angeben ?
Geschrieben von kean
ich finds schade, dass damit nur jpgs komprimiert werden (ansonsten hast du mir sehr geholfen!!)
Ich lös das einfach so, dass ich eine neue Funktion mit gifs mache (also zwei Funktionen - eine für jpg wenns eine ist und eine für gif)
Geschrieben von agavensaft.de
Ich habe die Funktion noch so erweitert, dass die Breite bzw. die Höhe nie höher sein kann, als definiert. Bei der Funktion von michi kann die Breite bzw. die Höhe u.U. höher werden, als angegeben.

<?php
function make_thumb($img_src, $img_width, $img_height, $des_src, $quali = 100) {
$im = imagecreatefromjpeg($img_src);
list($src_width, $src_height) = getimagesize($img_src);

if($src_width >= $src_height) {
$new_image_width = $img_width;
$new_image_height = $src_height * $img_width / $src_width;
if($new_image_height > $img_height) {
$new_image_height = $img_height;
$new_image_width = $src_width * $img_height / $src_height;
}
}
if($src_width < $src_height) {
$new_image_height = $img_height;
$new_image_width = $src_width * $img_height / $src_height;
if($new_image_width > $img_width) {
$new_image_width = $img_width;
$new_image_height = $src_height * $img_width / $src_width;
}
}
$new_image = imagecreatetruecolor($new_image_width, $new_image_height);
imagecopyresampled($new_image, $im, 0, 0, 0, 0, $new_image_width, $new_image_height, $src_width, $src_height);
imagejpeg($new_image, $des_src, $quali);
}
?>
Geschrieben von Lukas Anzinger
kleiner tipp zur qualität:

80 anstatt 100 bewirkt einen kaum erkennbaren bezüglich der bildqualität, die grösse wird jedoch _drastisch_ reduziert
Geschrieben von Jonas
Ist es möglich, dass da irgendwo noch ein fehler dabei ist?

wenn ich ein bild von 300x400 hochlade, dann wird es mit 100x200 gespeichert und damit in die höhe gezogen...
woran liegt das? oder was mache ich falsch?
Geschrieben von Burns
Bei mir funzt das nicht. Es gibt immer folgenden Fehler, wenn ich das php-skript aufrufe:


Warning: imagejpeg() [function.imagejpeg]: Unable to open 'http://hermau.ws4me.net/thumbs/thumb1.JPG' for writing in /home/abrunner/hermau.ws4me.net/htdocs/galerie.php on line 30

Code:

<?php
make_thumb("http://hermau.ws4me.net/magister/detail_all.JPG", 100, 75, "http://hermau.ws4me.net/thumbs/thumb1.JPG", 80);

function make_thumb($img_src, $img_width, $img_height, $des_src, $quali)
{
$im = imagecreatefromjpeg($img_src);
list($src_width, $src_height) = getimagesize($img_src);
if($src_width >= $src_height) {
$new_image_width = $img_width;
$new_image_height = $src_height * $img_width / $src_width;
}
if($src_width < $src_height) {
$new_image_height = $img_width;
$new_image_width = $src_width * $img_height / $src_height;
}
$new_image = imagecreatetruecolor($new_image_width, $new_image_height);
imagecopyresampled($new_image, $im, 0, 0, 0, 0, $new_image_width,$new_image_height, $src_width, $src_height);
imagejpeg($new_image, $des_src, $quali);


}
echo '<img src="http://hermau.ws4me.net/thumbs/thumb1.JPG">';
?>

Also das Bild, das im Funktionsaufruf übergeben wird, gibts. Und es soll dan thumb1.jpg heißen. Nur genau dieses thumb1.jpg kennt er nicht - wie auch, er muss es ja erstellen, aber dass sollte er ja eigentlich vorher machen.

Brauche dringend hilfe,
Mfg Hermau
Geschrieben von Hermau