• 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
  • Neue Blog-Einträge

    Adventure-PHP-Framework 1.12 erschienen

    Ich bin bisher nicht dazu gekommen - und wollte eigentlich die beiden links nennen: :arrow: http://www.golem.de/1008/77097.html :arrow:...

    20.08.2010 16:09

    Britische Regierung hält am IE6 fest

    Man könnte auch sagen "Tot erhoffte leben länger" :arrow: http://www.golem.de/1008/77035.html Leider sind halt in vielen Unternehmen speziell an den IE angepasste Programme im Einsatz, die es...

    20.08.2010 16:12

    Hosting-Dienst GitHub erreicht Millionen-Marke

    Während ich persönlich noch immer gerne SVN einsetze, ist git gerade voll im Trend. GitHub hatte die Tage zu vermelden, dass es mehr als eine Million Softwareprojekte "unter seinem Dach" hat....

    20.08.2010 16:15

    Screenshot unter Windows vom aktiven Fenster erstellen

    Der Trend, nicht nur einen Bildschirm bei der Arbeit am PC zu verwenden ist imho vorhanden. Wer - wie ich - gerne zwischendurch einen screenshot macht, der dürfte sich ggf. manches Mal geärgert...

    20.08.2010 16:20

    ListView-Spalten Automatisch ausrichten

    Listviews begegnen uns eigentlich jeden Tag aufs neue bei der täglichen Arbeit. Genauso oft nervt es, wenn man z.b. im Explorer Spalten verschieben muss, um einen Dateinamen einer Datei vollständig...

    24.08.2010 13:10
  • Neue Beiträge

    Sekundentakt

    Hi,

    ich weiß nicht genau, wie Deine Subselects aussehen. Aber falls die sich so ähnlich formulieren lassen:

    Code:
    SELECT something
    

    CONCAT_WS mit LEFT JOIN

    Sekundentakt 01.09.2010 15:30 Gehe zum letzten Beitrag
    DasMööp

    *ohje ... Antwort: Subselect *rolleye, damit fällt dann der JOIN weg.

    CONCAT_WS mit LEFT JOIN

    DasMööp 31.08.2010 13:29 Gehe zum letzten Beitrag
    DasMööp

    Hallo,

    bei einer Abfrage von zwei Tabellen ist in einer in zwei Spalten je die ID der einen hinterlegt und diese brauche ich in der CONCAT.

    CONCAT_WS mit LEFT JOIN

    DasMööp 31.08.2010 12:17 Gehe zum letzten Beitrag
    floppy

    Hallo DEVWinC, Hallo Spezialisten,

    ich stehe zur Zeit auf dem gleichen Problem, bei mir gibts beim BartPE (XP) nur einen BlueScreen nach

    [Booten] ISO-Images mit Bootloader starten & BartPE

    floppy 31.08.2010 10:48 Gehe zum letzten Beitrag

Impressum · Tutorials · Nutzungsbedingungen · thematisch sortierte Linklisten · Spendenaufruf · Team · Partnerprojekte

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 45 46 47 48