Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [PHP] thumbnails erstellen - kleine Funktion

Layoutprobleme? - Styleswitcher!

Antwort
 
Themen-Optionen
Alt 19.03.2005, 18:29 Nach oben    #1
Jann Hendrik
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 1.539
Standard [PHP] thumbnails erstellen - kleine Funktion

thumbnails erstellen - kleine Funktion
In diesem Tutorial geht es darum eine Funktion zu schaffen, die ein thumbnail in beliebiger Größe erstellt.

Benötigt wird neben einem Verzeichnis mit ausreichenden Rechten eine installierte GDlib. Desweiteren funktioniert diese Funktion nur mit JPEG-Dateien. Da in vielen GDlib-Versionen aus rechtlichen Gründen der gif-support entfernt werden musste. Allerdings ist in den neuen gdlib-Version wieder gif-support vorhanden. Ihr müßtet dann lediglich die Funktion ein wenig anpassen.
Die Überprüfung, ob es ein gif ist - oder jpeg, kann einfach in der 2. Zeile der Funktion erweitert werden. Hier möchte ich aber nicht weiter auf gif eingehen.

Die Idee ist, dass mittels Aufruf einer Funktion mkthumb() ein Bild, welches in Originalgröße vorhanden ist in kleinerer Form anzubieten.
Der Vorteil liegt klar auf der Hand:
-traffic wird verringert und damit der Seitenaufbau beim user beschleunigt.


Es sollte sicher gestellt sein, dass ein Verzeichnis auf dem webspace vorhanden ist, bei dem Schreibrechte vorhanden sind, sonst wird es zu Fehlermeldungen kommen!

Wie bei jedem guten Skript sollte man mit error_reporting(E_ALL); beginnen, um etwaige Fehler gleich gemeldet zu bekommen.

PHP-Code:
<?php
  error_reporting
(E_ALL);
?>
Ich muss mir nun überlegen, welche Parameter ich für die Funktion benötige.
Da wären:
- der Dateiname des Bildes
- Name des Ordners, in dem die Originale sind
- Name des Ordners, in den die Thumbs sollen
- Max. Ausdehnung der thumb-Datei in x-Richtung
- Max. Ausdehnung der thumb-Datei in y-Richtung

somit sieht die Funktion nun so aus:

PHP-Code:
<?php
  error_reporting
(E_ALL);

  
// Diese Funktion gibt es im Original unter [url]www.codeschnipsel.net[/url]
  // Ich habe sie ein wenig modifiziert
  
function mkthumb($img_src,     // Dateiname
                   
$img_width,   // max. Größe in x-Richtung
                   
$img_height,  // max. Größe in y-Richtung
                   
$folder_scr,  // Ordner der normalen Bilder
                   
$des_src)     // Ordner der Thumbs
  
{
    RETURN 
TRUE;
  }
?>
Nun kann ich natürlich immmer alle Werte im Skript beim Aufruf der Funktion übergeben, oder ich definiere schon sog. default Werte:

PHP-Code:
<?php
  error_reporting
(E_ALL);

  
// Diese Funktion gibt es im Original unter [url]www.codeschnipsel.net[/url]
  // Ich habe sie ein wenig modifiziert
  
function mkthumb($img_src,     // Dateiname
                   
$img_width "400",   // max. Größe in x-Richtung
                   
$img_height "400",  // max. Größe in y-Richtung
                   
$folder_scr "pictures",  // Ordner der normalen Bilder
                   
$des_src "thumbs")     // Ordner der Thumbs
  
{
    RETURN 
TRUE;
  }
?>
Das hat den Vorteil, dass ich im Skript selbst nur noch das Bild angeben muss. Der Rest ist optional.
Dir Rückgabe RETURN TRUE; bringt den Vorteil, dass man - wenn man möchte - später mittels if(mkthumb) im Skript abfragen kann, ob die Funktion erfolgreich ausgeführt wurde. Der zeit ist das noch nicht sinnvoll, weil die Funktion ja nichts anderes macht, als nur genau das eine.

Wir müßen in der Funktion einen Bezeichner auf das Bild selbst zurückgeben, der das aus der angegebenen Datei eingelesene Bild darstellt.

das geht mit folgender Zeile:
$image = imagecreatefromjpeg($folder_scr."/".$img_src);
Damit rufen wird das Originalbild auf - in Abhängigkeit von den Parametern, mit welcher wir die Funktion aufrufen.

Dann lesen wir die Höhe und die Breite des Bildes aus:
list($src_width, $src_height) = getimagesize($folder_scr."/".$img_src);
Somit haben wir in $src_width die Breite und in $src_height) die Höhe des Bildes. Das ist wichtig, weil wir das Bild natürlich im gleichen Verhältnis verkleinern wollen.

Abhängig davon, ob das Bild nun in Hoch- oder Querformat vorliegt wird nun die neue Dimension errechnet.

Somit sieht der Code schon wie folgt aus:
PHP-Code:
<?php
  error_reporting
(E_ALL);

  
// Diese Funktion gibt es im Original unter [url]www.codeschnipsel.net[/url]
  // Ich habe sie ein wenig modifiziert
  
function mkthumb($img_src,     // Dateiname
                   
$img_width "400",   // max. Größe in x-Richtung
                   
$img_height "400",  // max. Größe in y-Richtung
                   
$folder_scr "pictures",  // Ordner der normalen Bilder
                   
$des_src "thumbs")     // Ordner der Thumbs
  
{
    
$image imagecreatefromjpeg($folder_scr."/".$img_src);
    list(
$src_width$src_height) = getimagesize($folder_scr."/".$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;
    RETURN 
TRUE;
    }
?>
Nun muss 'nur noch' das thumb erstellt werden. Wir haben alle wichtigen Daten über das Original in Erfahrung gebracht.

Die Vorgehensweise ist nun:
ein Bild erstellen, dass die Größe des thumbs hat und das Original auf das erstellte Bild kopieren. Das geht so:

Bild erstellen:
$new_image = imagecreatetruecolor($new_image_width, $new_image_height);

Bild kopieren:
imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_image_width,$new_image_height, $src_width, $src_height);

Was dann noch fehlt ist die Ausgabe des thumbs. Das sieht so aus:
imagejpeg($new_image, $des_src."/".$img_src, 100);

Somit wäre die Funktion fertig:
PHP-Code:
<?php
  error_reporting
(E_ALL);

  
// Diese Funktion gibt es im Original unter [url]www.codeschnipsel.net[/url]
  // Ich habe sie ein wenig modifiziert
  
function mkthumb($img_src,     // Dateiname
                   
$img_width "400",   // max. Größe in x-Richtung
                   
$img_height "400",  // max. Größe in y-Richtung
                   
$folder_scr "pictures",  // Ordner der normalen Bilder
                   
$des_src "thumbs")     // Ordner der Thumbs
  
{
    
$image imagecreatefromjpeg($folder_scr."/".$img_src);
    list(
$src_width$src_height) = getimagesize($folder_scr."/".$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$image0000$new_image_width,$new_image_height$src_width$src_height);
    
imagejpeg($new_image$des_src."/".$img_src100);
    RETURN 
TRUE;
  }
?>
Aufrufen kann man die Datei im eigentlichen Skript z.B. so:
PHP-Code:
<?php
  error_reporting
(E_ALL);

  if(!
file_exists("thumbs/bild.jpeg"))
    
mkthumb('bild.jpeg');
  echo 
'<a href="pictures/bild.jpeg"><img src="thumbs/bild.jpeg"></a>';
?>
Mit der Funktion file_exists() wird geprüft, ob das thumb schonmal erstellt wurde. Denn wenn ja, so muss das nicht nochmal geschehen. Dann wird der Server entlastet und der Seitenaufbau beschleunigt.


Der bisherige Teil dieses Tutorials hat sich nur auf jpeg-Bilder beschränkt. Sinnvoll wäre, wenn die Funktion auch gif und png verarbeiten kann und diese selbstständig unterscheiden kann.

Dafür wird die Zeile
PHP-Code:
list($src_width$src_height) = getimagesize($folder_scr."/".$img_src); 
noch ein wenig erweitert:
PHP-Code:
list($src_width$src_height$src_typ) = getimagesize($folder_scr."/".$img_src); 
so dass nun auch der Bild-Typ erfasst wird.

Wenn man nun eine Fallunterscheidung zwischen GIF, JPG und PNG macht, dann müßen nur jeweils zwei Zeilen angepasst werden, damit auch die beiden Datentypen verarbeitet werden können.

Das sieht dann so aus:
PHP-Code:
<?php
  
// Diese Funktion gibt es im Original unter [url]www.codeschnipsel.net[/url]
  // Ich habe sie ein wenig modifiziert
  
function mkthumb($img_src,     // Dateiname
                   
$img_width  "400",       // max. Größe in x-Richtung
                   
$img_height "400",       // max. Größe in y-Richtung
                   
$folder_scr "pictures",  // Ordner der normalen Bilder
                   
$des_src    "thumbs")    // Ordner der Thumbs
  
{
    
// Größe und Typ ermitteln
    
list($src_width$src_height$src_typ) = getimagesize($folder_scr."/".$img_src);

    
// neue Größe bestimmen
    
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;
    }

    if(
$src_typ == 1)     // GIF
    
{
      
$image imagecreatefromgif($folder_scr."/".$img_src);
      
$new_image imagecreate($new_image_width$new_image_height);
      
imagecopyresampled($new_image$image0000$new_image_width,$new_image_height$src_width$src_height);
      
imagegif($new_image$des_src."/".$img_src100);
      
imagedestroy($image);
      
imagedestroy($new_image);
      return 
true;
    }
    elseif(
$src_typ == 2// JPG
    
{
      
$image imagecreatefromjpeg($folder_scr."/".$img_src);
      
$new_image imagecreatetruecolor($new_image_width$new_image_height);
      
imagecopyresampled($new_image$image0000$new_image_width,$new_image_height$src_width$src_height);
      
imagejpeg($new_image$des_src."/".$img_src100);
      
imagedestroy($image);
      
imagedestroy($new_image);
      return 
true;
    }
    elseif(
$src_typ == 3// PNG
    
{
      
$image imagecreatefrompng($folder_scr."/".$img_src);
      
$new_image imagecreatetruecolor($new_image_width$new_image_height);
      
imagecopyresampled($new_image$image0000$new_image_width,$new_image_height$src_width$src_height);
      
imagepng($new_image$des_src."/".$img_src);
      
imagedestroy($image);
      
imagedestroy($new_image);
      return 
true;
    }
    else
    {
      return 
false;
    }
  }
?>
Mit imagedestroy($image) wird der verwendete Speicher wieder freigegeben.

Und damit kann die Funktion neben JPEG nun auch GIF-und PNG-Bilder verkleinern.


Anmerkung:
Für die Verarbeitung von GIF bedarf es die gdlib kleiner als 1.6 oder größer als Version 2.0.28, denn die gif-Verarbeitung war zwischenzeitlich nicht implementiert.

Darüber hinaus wird in diesem Beispiel bei GIF-Bildern auf die Verwendung von imagecreatetruecolor (24bit) verzichtet, da gif maximal nur 256 Farben (8bit) verarbeiten kann.


Die benutzten Funktionen:
error_reporting
imagecreatefromjpeg
list
getimagesize
imagecreatetruecolor
imagecopyresampled
imagejpeg
opendir
file_exists
imagedestroy


Jetzt solltet Ihr eigentlich in der Lage sein, das Script ohne Vorlage nachzuprogrammieren. Die verwendeten Funktionen findet Ihr alle im PHP-Manual.

Solltet Ihr Fragen zu dem Tutorial haben, so schreibt bitte einen Beitrag im PHP-Forum mit einem Verweis auf dieses Tutorial.
Danke.

Grüße Jann Hendrik

Geändert von Jann Hendrik (07.09.2007 um 09:48 Uhr).
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.12.2007, 11:18 Nach oben    #2
Jann Hendrik
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 1.539
Standard

folgender link sei noch empfohlen:
thumbnail-Klasse; Qualität ok?
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2008, 11:38 Nach oben    #3
Jann Hendrik
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 1.539
Standard

weiterhin ist dieser link sehr interessant:
Ich bekomme Thumbnail Funktion von Jann Hendrik nicht zum laufen!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

« [PHP] PHPUnit oder testgetriebene Entwicklung | [php] Validität von ISBN kontrollieren »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge anzufügen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP] Zeitformate, Datum und Co Jann Hendrik Tutorials 0 05.12.2006 19:48
[SUCHE] Funktion erstellen Jan Gesuche 5 30.10.2006 11:09
[PHP] FTP-Funktionen in PHP nutzen MrNiceGuy Tutorials 0 24.05.2006 14:18
[PHP] Rekursives Erstellen von Verzeichnissen Jojo Tutorials 4 12.03.2006 19:26
[PHP] Wie kann ich eine Textdatei erstellen und mit Inhalt füllen? Ben Tutorials 2 06.09.2005 11:17


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:14 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.6.7, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

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 36 37 38 39 40 41 42 43 44