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

Mit PHP Thumbnails erstellen



Große Bilder nehmen viel Ladezeit in Anspruch. Gerade für Modem- oder ISDN-Nutzer ist das eine nervenaufreibende Sache.
Dennoch lässt sich da etwas machen: PHP kann Bilder verkleinern und somit auch in der Dateigröße minimieren.
Und das ist eigentlich gar nicht schwer. Hier einmal beinahe unkommentiert das Script, weiter unten findest du dann die Erklärungen. Dieses Script wird in einer eigenen Datei, sagen wir
Code:
bildklein.php
gespeichert.

PHP-Datei:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<? 
// Bilddaten feststellen 
  
$size=getimagesize($_GET['bild']); 
  
$breite=$size[0]; 
  
$hoehe=$size[1]; 

  
//hier die Breite festlegen 
  
$neueBreite=100
  
$neueHoehe=intval($hoehe*$neueBreite/$breite); 

  if(
$size[2]==1) { 
  
// GIF 
  
$altesBild=ImageCreateFromGIF($_GET['bild']); 
  
$neuesBild=ImageCreate($neueBreite,$neueHoehe); 
  
ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe); 
  
ImageGIF($neuesBild); 
  } 

  elseif(
$size[2]==2) { 
  
// JPG 
  
$altesBild=ImageCreateFromJPEG($_GET['bild']); 
  
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
  
ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe); 
  
ImageJPEG($neuesBild); 
  } 

  elseif(
$size[2]==3) { 
  
// PNG 
  
$altesBild=ImageCreateFromPNG($_GET['bild']); 
  
$neuesBild=imagecreatetruecolor($neueBreite,$neueHoehe); 
  
ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe); 
  
ImagePNG($neuesBild); 
  } 

?>


Nun wird das Script von oben nach unten durchgenommen: Es erhält eine Variable
Code:
$bild
, die den "Standort" des Originalbildes angibt.
Nun werden einige Bildinformationen aus dem Quellbild aus: Die Breite, die Höhe und den Typ des Bildes:
Code:

$size=getimagesize($bild);
$breite=$size[0];
$hoehe=$size[1];

Die Funktion getimagesize() liefert einen vierdimensionalen Array zurück. Der Index 0 enthält die Breite, Index 1 die Höhe des Bildes, Index 2 liefert den Typ des Bildes (1=GIF, 2=JPG, 3=PNG, SWF=4) zurück und index 3 liefert eine HTML-Ausgabe
Code:
height="xxx" width="xxx"
zurück.
Nun wird die neue Breite des Bildes (in Pixeln) festgesetzt und daraus die Höhe errechnet.
Anschließend wird der Index 2 von
Code:
getimagesize()
ausgenutzt und je nach Bildtyp weiterverfahren. Da aber alle Verfahrensweisen im Grunde gleich sind, zeige ich das nur anhand des Beispieles von JPG, der Rest läuft analog dazu.
Wird erkannt, dass das Originalbild ein Bild des Types jpg (oder jpeg) ist, so wird mittels der Funktion imagecreatefromjpeg() ein neues, PHP-internes Bild generiert. Danach wird ein zweites, PHP-internes Bild mit der Größe des neuen (verkleinerten) Bildes erstellt (imagecreate()). Nun wird das große Originalbild in das verkleinerte Bild eingefügt (imagecopyresized()). Der letzte Schritt ist es, das Bild an den Browser zu senden.

Der Aufruf des Scriptes wäre dann z.B.
Code:
<img src="bildklein.php?bild=http://www.meinedomian.de/grossbild.jpg">
.
Oder, um vom kleinen Bild einen Link zum großen Bild zu legen:
Code:
<a href="http://www.meinedomian.de/grossbild.jpg"><img src="bildklein.php?bild=http://www.meinedomian.de/grossbild.jpg"></a>


Um dir aber gleich den Wind aus den Segeln zu nehmen (nicht, dass ich das beabsichtigt hätte), diese Funktionen erfahren 2 Einschränkungen.
Die erste ist die wohl gravierendeste: PHP muss für diese Funktionen ein bestimmtes Modul eingebunden haben. Dieses Modul heisst GD-Lib und sorgt dafür, dass PHP Bilder erstellen, verändern und senden kann. Ohne dieses Modul funktioniert das alles hier nicht. Ob du es auf deinem Websapce hast, kannst du über phpinfo() herausfinden.
Die zweite Einschränkung ist, dass ab der GD-Lib Version 1.6 (und höher) keine gif-Manipulationen mehr möglich sind. Somit bliebe nur noch die Manipulation von den jpg- und png-Bildern.

Geschrieben von Phil Marx am 18.06.2004 (48531x gelesen)
weiterempfehlen weiterempfehlen   Druckversion Druckversion   kommentieren kommentieren

Die ganzen PaidSpace Anbieter unterstützen das in der Regel, aber bei den Freehostern ist das häufig nicht möglich, wegen dem Code für die Werbung! An alle, die bei area51.li sind: dort geht es nicht!
Geschrieben von michi
Äh ich hab zwar von GD noch keine Ahnung - aber meines Erachtens ist es wohl nicht Sinn der Sachhe, dass der Thumbnail bei jeder Anfrage neu erstellt wird -oder???
Geschrieben von Berni
Also das mit dem ständigen Neuerstellen der Thumbs ist wirklich nicht so die feine Art !!! Da hat der Server ab eine gewissen Anzahl von Zugriffen ja eine höllen Arbeit !!! Also am besten einen Ordner für die originalen Bilder anlegen und einmal daraus je eine Thumb für die darin enthaltenen Bilder erstellen lassen. So mache ich es zumindest bei jedem hochladen von Bildern !!!
Geschrieben von DangerZone
Das mit der GD-Library scheint aber ganz unerwünschte Qualtät zu generieren. Hab das mal mit jpgs probiert. Selbst bei B: 100, H: 75 gibt das Thumbs, die 5mal größer sind, als die offline generierten (Photopaint). Außerdem sahen die <2kb-offline-Ergebnisse immernoch weit besser aus als die 5mal größeren GD-Ergebnisse (bei 100%). Gibts da nicht was besseres?



Ach so, war unter WinME mit der "php_gd2.dll", vielleicht sieht das sonst besser aus (?).



Grüße
Geschrieben von agitator
also bei mir wird das generierte thumbnail erst gar nicht dargestellt (hab den code fast 1zu1 übernommen) :-(
Geschrieben von Sh00tingStar
Hi,

ich hab hier ein kleines Script für euch, mit dem man Bilder (hier nur JPG) uploaden kann. Sobald das Bild in ein Verzeichnis auf dem Server verschoben wurde, wird gleich auch noch ein dazu passendes Thumbnail in guter Qualität (ab GD 2.0.1) erstellt.

Formular aus "upload.php":

<form enctype="multipart/form-data" action="upload_now.php" method="post">
Bild:<br>
<input type="file" name="picture"></input><br>
<br>
<input type="submit" value="Uploaden"></input>
</form>

Script aus "upload_now.php":

<?

// Datei auf Grösse kontrollieren

$maxsize = 200; // KB
$maxsize = $maxsize * 1024; // Umwandlung in Byte

if ($_FILES['picture']['size'] > $maxsize)
{
header ("location: upload_error.php"); exit;
}

// Datei verschieben

$dir = "/home/.sites/37/site869/web/test/pictures/";

if ($_FILES['picture']['size'] > "0")
{
$timestamp = time();
$filename = $timestamp."_".$_FILES['picture']['name'];

move_uploaded_file ($picture, "$dir$filename");
chmod ("$dir$filename", 0644);
}

// Datei auf Typ kontrollieren und wenn nötig wieder löschen

$fileinfos = getimagesize("$dir$filename");
$type = $fileinfos[2]; // 2 = JPG

if ($type != 2)
{
unlink("$dir$filename"); // Löschen
header ("location: upload_error.php"); exit;
}

// Thumbnail erstellen
//////////////////////

// Anmerkungen:
//
// $dir = Pfad für das Verzeichnis, in dem sich das upgeloadete Bild befindet
// $filename = dateiname.jpg

// Größe des Bildes auslesen

$size = getimagesize("$dir$filename");
$width = $size[0];
$height = $size[1];

// Breite des Thumbnails festlegen (Höhe wird automatisch angepasst)

$width_tn = 110;
$height_tn = intval($height * $width_tn / $width);

// Bei GD < 2.0.1: ImageCreateTrueColor -> ImageCreate, ImageCopyResampled -> ImageCopyResized

$picture = ImageCreateFromJPEG("$dir$filename");
$picture_tn = ImageCreateTrueColor($width_tn,$height_tn);
ImageCopyResampled($picture_tn,$picture,0,0,0,0,$width_tn,$height_tn,$width,$height);

// Endung "_tn" bei Dateiname hinzufügen, vor ".jgp"

$filename = explode (".", $filename);
$tn = "_tn.";

// Thumbnail in $dir mit angepasstem $filename speichern, JPG Qualität: 95

ImageJPEG($picture_tn,"$dir$filename[0]$tn$filename[1]",95);

// Temporären Speicher auf Server wieder frei geben

ImageDestroy($picture);
ImageDestroy($picture_tn);

?>

So, das war's :) Ich hoffe, es hilft dem einen oder anderen weiter. Schaut mal auf meiner Website vorbei: www.solid-design.at
Geschrieben von Daniel Mühlbacher