Home

Thumbnail von einem Bild erzeugen

Sonntag, 4. März 2007 | Autor: Pr0g

Diese Funktion erzeugt von einem übergebenen Bild einen Thumbnail (verkleinerte Version des Bildes) - es wird die GDLib benötigt, welche bei den meisten PHP Installationen dabei sein sollte.

Als Bildformate werden GIF, JPG und PNG unterstützt (sofern in der GDLib aktiviert).
Da die Funktion recht vielseitig ist werde ich nun zuerst die einzelnen Parameter erklären:

  • $source: Hier wird das Quellbild angegeben, welches verkleinert werden soll.
  • $new_size: Hier wird die maximale Breite oder Höhe des Bildes angegeben. Ist das Bild breiter als hoch, so wird die Breite auf diesen Wert gesetzt und die Höhe proportional angepasst. Anders herum genauso. Wird dieser Wert angegeben, so werden alle weiteren Größenwerte ignoriert. Falls eine der anderen Größenvarianten genutzt werden soll, muss dieser Wert auf 0 gesetzt werden.
  • $new_width / $new_height: Werden beide Werte angegeben, so wird das Bild fest auf diese Werte verkleinert. Wird nur einer der Werte angegeben und der andere auf 0 gesetzt, so wird der auf 0 gesetzte Wert proportional berechnet.
  • $target: Hier wird der Name und Bildtyp für das Zielbild angegeben. Soll das Bild direkt im Browser ausgegeben werden (nähere Infos dazu weiter unten) so muss der gewünschte Bildtyp (gif, jpg, png) angegeben werden. Alternativ kann auch ein Dateiname angegeben werden, unter dem das Zielbild dann gespeichert wird. Der Bildtyp wird dann aus dem Dateinamen ermittelt (bspw. name.jpg).
  • $quali: Dieser Parameter ist optional (Standardwert 100) und kann angegeben werden, wenn das Zielbild vom Typ JPG ist und eine andere Komprimierungsqualität als 100 erwünscht wird. Bei allen anderen Bildtypen wird der Parameter - falls angegeben - ignoriert.

Die fünf Beispielaufrufe sollten separat aufgerufen werde (die anderen bspw. auskommentieren). Die ersten vier speichern den Thumbnail unter dem angegebenen Dateinamen. Das fünfte Beispiel erzeugt eine direkte Ausgabe des Bildes mit dem angegebenen Typ.

Da bei der direkten Ausgabe der Header angepasst wird darf zuvor keine Ausgabe erfolgt sein. Bei der direkten Ausgabe kann die PHP Datei auch als src-Attribut für einen img-Tag genutzt werden, da durch die Anpassung des Headers dem Browser mitgeteilt wird, dass es sich um ein Bild handelt. Eine direkte Ausgabe empfiehlt sich nur in wenigen Fällen, da die Verkleinerung des Bildes so bei jedem Aufruf stattfindet und der Server dadurch mehr belastet wird, als wenn das Bild einmal verkleinert und gespeichert wird. Dann kann immer direkt die verkleinerte Ausgabe angezeigt werden.

Hat alles geklappt, so gibt die Funktion den Wert true zurück, andernfalls eine Fehlermeldung. Damit der Wert true richtig erkannt werden kann ist eine typensichere Abfrage durch === erforderlich.

<?php

//
// Thumbnail von einem Bild erzeugen
//
function CreateThumbnail($source$new_size$new_width$new_height$target$quali 100) {
  
// Prüfen ob die GDLib geladen ist
  
if (!extension_loaded('gd')) {
    return 
'GDLib wurde nicht geladen!';
  }

  
// Prüfen welche Bildformate unterstützt werden
  
$gd_types = array();
  if (
ImageTypes() & IMG_GIF) {
    
array_push($gd_types1'gif');
  }
  if (
ImageTypes() & IMG_JPG) {
    
array_push($gd_types2'jpg');
  }
  if (
ImageTypes() & IMG_PNG) {
    
array_push($gd_types3'png');
  }

  
// Quellbildmaße und -typ ermitteln
  
if (!$image_data = @getimagesize($source)) {
    return 
'Quellbild konnte nicht geöffnet werden!';
  }
  list(
$width$height$type) = $image_data;

  
// Quellbild laden
  
if (!in_array($type$gd_types)) {
    return 
'Der Quellbildtyp wird von ihrer GDLib nicht unterstützt!';
  }
  switch (
$type) {
    case 
1$img imagecreatefromgif($source); break;
    case 
2$img imagecreatefromjpeg($source); break;
    case 
3$img imagecreatefrompng($source);
  }

  
// Neue Größe bei gleichbleibenden Proportionen bestimmen
  
if ($new_size 0) {
    
$new_width = ($width >= $height $new_size 0);
    
$new_height = ($height $width $new_size 0);
  }
  if (
$new_width == || $new_height == 0) {
    if (
$new_width == && $new_height == 0) {
      return 
'Mindestens ein Wert muss für das Zielmaß angegeben werden!';
    } else {
      if (
$new_width == 0) {
        
$new_width round($new_height $width $height);
      } elseif (
$new_height == 0) {
        
$new_height round($new_width $height $width);
      }
    }
  }

  
// Zielbildtyp bestimmen
  
if (empty($target)) {
    return 
'Es wurde kein Zielbildtyp oder Zielbildname angegeben!';
  }
  
$dot strrpos($target'.');
  if (
$dot === false) {
    
$target_type strtolower($target);
    
$save false;
  } else {
    
$target_type strtolower(substr($target$dot 1strlen($target) - $dot 1));
    
$save true;
  }
  if (!
in_array($target_type$gd_types)) {
    return 
'Der Zielbildtyp wird von ihrer GDLib nicht unterstützt!';
  }

  
// Zielbild erstellen
  
if ($target_type == 'gif' || !function_exists('imagecreatetruecolor')) {
    
$timg imagecreate($new_width$new_height);
  } else {
    
$timg imagecreatetruecolor($new_width$new_height);
  }

  
// Quellbild verkleinern
  
imagecopyresampled($timg$img0000$new_width$new_height$width$height);

  
// Bei direkter Ausgabe den Header anpassen
  
if (!$save) {
    
header('content-type: image/' . ($target_type == 'jpg' 'jpeg' $target_type));
  }

  
// Zielbild speichern oder ausgeben
  
switch ($target_type) {
    case 
'gif': if ($save) { imagegif($timg$target); } else { imagegif($timg); } break;
    case 
'jpg': if ($save) { imagejpeg($timg$target$quali); } else { imagejpeg($timg''$quali); } break;
    case 
'png': if ($save) { imagepng($timg$target); } else { imagepng($timg); }
  }

  
// Bildspeicher freigeben
  
imagedestroy($img);
  
imagedestroy($timg);

  return 
true;
}

//
// Beispielaufruf 1: Feste Größe, Thumb speichern als JPG mit 80% Qualität
//
$status CreateThumbnail('grosses_bild.png'0150150'kleines_bild1.jpg'80);
echo (
$status === true 'Bild wurde gespeichert!' 'Fehler: ' $status);

//
// Beispielaufruf 2: Feste Breite, Thumb speichern als PNG
//
$status CreateThumbnail('grosses_bild.png'01500'kleines_bild2.png');
echo (
$status === true 'Bild wurde gespeichert!' 'Fehler: ' $status);

//
// Beispielaufruf 3: Feste Höhe, Thumb speichern als PNG
//
$status CreateThumbnail('grosses_bild.png'00150'kleines_bild3.png');
echo (
$status === true 'Bild wurde gespeichert!' 'Fehler: ' $status);

//
// Beispielaufruf 4: Maximale Breite oder Höhe, Thumb speichern als PNG
//
$status CreateThumbnail('grosses_bild.png'15000'kleines_bild4.png');
echo (
$status === true 'Bild wurde gespeichert!' 'Fehler: ' $status);

//
// Beispielaufruf 5: Feste Breite, Thumb direkt ausgeben als PNG
//
CreateThumbnail('grosses_bild.png'01500'png');

?>
Tags » , , «

Trackback: Trackback-URL | Feed zum Beitrag: RSS 2.0
Thema: Codes

Diesen Beitrag kommentieren.

Kommentar abgeben