[PHP] Thumbnails bei Bedarf generieren

So, hier ein kleiner Codeschnipsel den ich für wichtig erachte und ggf. selber nochmal brauche.
Ich stelle ihn mal hier ein damit ich von überall auf den Schnipsel zugreifen kann und er ggf. auch anderen Hilft.

Es geht darum bei Bedarf ein Thumnail eines vorhanden Bildes zu generieren.
„Der Bedarf“ ensteht dann, wenn ein neues Bild vorhanden ist.
Und das dürfte in etwa immer dann der Fall sein, wenn die „letzte Dateiänderung“ des Orginalbildes „jünger“ ist als die des Thumbnails.
Von daher ist dies erstmal zu überprüfen:

  1. $fotoPfad = "gfx/fotos/"; //Der Slash am Ende ist wichtig
  2. $thumbPfad = "gfx/fotos/thumbs/"; //Der Slash am Ende ist wichtig
  3.  
  4. function checkThumbnail($bild) {
  5.      global $fotoPfad;
  6.      global $thumbPfad;
  7.  
  8.      $fotoZeit= filemtime($fotoPfad.$bild);
  9.  
  10.      $thumbZeit = @filemtime($thumbPfad.$bild);
  11. //Sollte kein Bild vorhanden sein ist das Ergebnis auch 0 und das reicht uns.
  12.  
  13.      if ($fotoZeit > $thumbZeit)  {
  14.           createThumb($bild);
  15.      }
  16. }

So
Wenn es also nötig ist ein Thumbnail zu erstellen, dann mal los:
Achtung! Dies ist die Methode für GD 2.x. Sie erstellt schöne TrueColor-Bildchen.
GD 1.x kann leider nicht mit TrueColor umgehen (zumindestens in diesem Zusammenhang. Code dafür steht weiter unten)

  1. function createThumb($bild) {
  2.      global $fotoPfad;
  3.      global $thumbPfad;
  4.      $thumbHoehe = 100;
  5.      $tumbBreite = 150;
  6.      $size=getimagesize("$fotoPfad"."$bild");
  7.      $breite=$size[0];
  8.      $hoehe=$size[1];
  9.  
  10.      $altesBild=ImageCreateFromJPEG($fotoPfad.$bild);
  11.      $neuesBild=imageCreateTrueColor($thumbBreite,$thumbHoehe);
  12.      imageCopyResampled($neuesBild,$altesBild,0,0,0,0,$thumbBreite,$thumbHoehe,$breite,$hoehe);
  13.      ImageJPEG($neuesBild,"$thumbPfad"."$bild",85);
  14.  
  15. }

Dabei ist zu beachten, dass hier immer auf 150×100 skaliert wird.
Wenn die Ausgangasbilder ein äquivalentes Seitenverhältnis haben ist es ok, sonst müsste man ggf. noch ein bisschen Rumrechnen.

Die GD 1.x-Benutzer müssen astelle von ImageCreateTrueColor ImageCreate verwenden und müssen auch anstelle von imageCopyResample imageCopyResize verweden.
Die Parameterlisten sind die selben.
Die Thumbs die Dabei entstehen sind aber wirklich unter aller Sau.

Ich denke die Variablennamen sind so gewählt, dass der Code selbsterklärend ist und jeder ihn für seine Zwecke umbasteln kann.

2 Antworten auf „[PHP] Thumbnails bei Bedarf generieren“

  1. ist zwar schon ein etwas älterer blog eintrag ;)… wollte mich trotzdem für den php schnipsel bedanken und dir meine etwas verbesserte (und schreibfehlerfrei :D) version posten.

    $thumbZeit)
    {
    createThumb($bild);
    }
    }

    function createThumb($bild)
    {
    global $fotoPfad;
    global $thumbPfad;

    $size=getimagesize(„$fotoPfad“.“$bild“);

    $breite=$size[0];
    $hoehe=$size[1];

    $thumbBreite=150;
    $thumbHoehe=$hoehe/($breite/$thumbBreite);

    $altesBild=ImageCreateFromJPEG($fotoPfad.$bild);
    $neuesBild=imageCreateTrueColor($thumbBreite,$thumbHoehe);

    imageCopyResampled($neuesBild,$altesBild,0,0,0,0,$thumbBreite,$thumbHoehe,$breite,$hoehe);
    ImageJPEG($neuesBild,“$thumbPfad“.“$bild“,85);
    }

    checkThumbnail($picture);
    ?>

  2. ups irgendwie ist die hälfte auf der strecke geblieben ^^

    $thumbZeit)
    {
    createThumb($bild);
    }
    }

    function createThumb($bild)
    {
    global $fotoPfad;
    global $thumbPfad;

    $size=getimagesize(„$fotoPfad“.“$bild“);

    $breite=$size[0];
    $hoehe=$size[1];

    $thumbBreite=150;
    $thumbHoehe=$hoehe/($breite/$thumbBreite);

    $altesBild=ImageCreateFromJPEG($fotoPfad.$bild);
    $neuesBild=imageCreateTrueColor($thumbBreite,$thumbHoehe);

    imageCopyResampled($neuesBild,$altesBild,0,0,0,0,$thumbBreite,$thumbHoehe,$breite,$hoehe);
    ImageJPEG($neuesBild,“$thumbPfad“.“$bild“,85);
    }

    checkThumbnail($picture);
    echo „$fotoPfad$picture“;
    ?>

Schreibe einen Kommentar