5
Apr/08
7

[Archiv] PHP Tutorial: Thumbnails mit fester Größe und Rand

Ich habe gerade beim Aufräumen ein wenig in meinen Datensicherungen gewühlt und ein schönes Code-Schnipselchen von ~2004 gefunden. Es fühlt sich an, als wenn das eine Ewigkeit her ist, auf dem Papier sind es aber irgendwie doch “nur” vier Jahre.

Um die Zeit war ich in einer PHP-Community aktiv, im Rahmen einer Diskussion ist da irgendwann dieses kleine PHP-Script entstanden.

Das Script dient dazu aus Bildern im JPG-, GIF- oder PNG-Format Thumbnails (Vorschau-Bilder) zu erstellen. Soweit nichts besonderes. Das tolle an dem Snippet war, dass man eine feste Höhe UND Breite für das Bild angeben konnte, das Script hat das Thumbnail in dieser Größe erstellt und das Ursprungs-Bild unter Berücksichtigung der Seitenverhältnisse in dem Thumbnail abgebildet. Wenn das Bild nicht das komplette Thumnail ausfüllte, dann wurde dieses durch einen farbigen Rand ergänzt. Toll war das…

Mit Sicherheit würde ich das heute anders schreiben, ich möchte dieses Stück Code aber gerne so aufbewahren, wie es “damals” geschaffen wurde. Ich bin vor allem von der eifrigen Kommentierung beeindruckt, wobei da sicherlich einige Kommentare entbehrlich sind.

Hier also der besagte Code…

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?PHP
//Dateipfad unter die Bilder liegen
$pfad = './';
//Dateiname des Ursprungsbildes
$bild = 'bild.gif';
//Dateiname des Thumbnails
$thumb = 'bild_thumb.gif';
 
//Welche Breite soll das finale Thumbnail haben?
$resWidth = 128;
//Welche Höhe soll das finale Thumbnail haben?
$resHeight = 96;
 
//Wenn die Datei nicht existiert...
if(!file_exists($pfad.$bild))
{
    //Ausgeben einer Fehlermeldung und Beenden des Scriptes
    die('Die angegebene Datei existiert nicht.');
}
 
 //Aulesen der Höhe,Breite und des Dateityps des Bildes
$size = getimagesize($pfad.$bild);
 //Das erste Element des Arrays $size beinhaltet die Breite
$width = $size['0'];
 //Das zweite Element des Arrays $size beinhaltet die Höhe
$height = $size['1'];
 //Das zweite Element des Arrays $size beinhaltet den Typ
$typ = $size['2'];
 
switch($typ)
{
    //Wenn das Bild ein GIF ist...
    case 1:
        //Erstellen des ursprünglichen Bildes
        $img = ImageCreateFromGIF($pfad.$bild);
    break;
    //Wenn das Bild ein JPG ist...
    case 2:
        //Erstellen des ursprünglichen Bildes
        $img = ImageCreateFromJPEG($pfad.$bild);
    break;
    //Wenn das Bild ein PNG ist...
    case 3:
        //Erstellen desursprünglichen Bildes
        $img = ImageCreateFromPNG($pfad.$bild);
    break;
    //Wenn die Datei kein GIF,JPG oder PNG ist...
    default:
        //Ausgeben einer Fehlermeldung und Beenden des Scriptes
        die('Sorry, das Dateiformat wird nicht unterstützt.');
    break;
}
 
//Wenn die Breite größer ist als die Höhe...
if($width > $height)
{
    //Die Breite steht fest
    $thumbWidth = $resWidth;
    //Errechnen des Divisors
    $div = $width / $thumbWidth;
    //Errechnen der Höhe
    $thumbHeight = $height / $div;
 
    //Festlegen der X-Koordinate auf 0
    $xAnfang = 0;
    //Errechnen der Y-Koordinate an denen das temporäre Bild in das finale Thumbnail eingefügt wird
    $yAnfang = ($resHeight - $thumbHeight) / 2;
}
//Wenn die Höhe größer ist als die Breite...
elseif($height > $width)
{
    //Die Höhe steht fest
    $thumbHeight = $resHeight;
    //Errechnen des Divisors
    $div = $height / $resHeight;
    //Errechnen der Höhe
    $thumbWidth = $width / $div;
 
    //Errechnen der X-Koordinate an denen das temporäre Bild in das finale Thumbnail eingefügt wird
    $xAnfang = ($resWidth - $thumbWidth) / 2;
    //Festlegen der Y-Koordinate auf 0
    $yAnfang = 0;
}
//Wenn beide Seiten gleich lang sind...
else
{
    //Wenn die Breite größer ist als die Höhe...
    if($resWidth > $resHeight)
    {
        //Festlegen der Höhe des temporären Bildes auf die Höhe des finalen Bildes
        $thumbHeight = $resHeight;
        //Festlegen der Breite des temporären Bildes auf die Höhe des finalen Bildes
        $thumbWidth = $resHeight;
    }
    //Wenn die Höhe größer ist als die Breite...
    elseif($resHeight > $resWidth)
    {
        //Festlegen der Höhe des temporären Bildes auf die Breite des finalen Bildes
        $thumbHeight = $resWidth;
        //Festlegen der Breite des temporären Bildes auf die Breite des finalen Bildes
        $thumbWidth = $resWidth;
    }
    //Wenn beide Seite gleich sind...
    else
    {
        //Festlegen der Höhe des temporären Bildes auf die Höhe des finalen Bildes
        $thumbHeight = $resHeight;
        //Festlegen der Breite des temporären Bildes auf die Höhe des finalen Bildes
        $thumbWidth = $resHeight;
    }
 
    //Errechnen der X-Koordinate an denen das temporäre Bild in das finale Thumbnail eingefügt wird
    $xAnfang = ($resWidth - $thumbWidth) / 2;
    //Errechnen der Y-Koordinate an denen das temporäre Bild in das finale Thumbnail eingefügt wird
    $yAnfang = ($resHeight - $thumbHeight) / 2;
}
 
//Erstellen eines temporären Bildes um ein Thumbail des Bildes zu erstellen
$tmpImg = ImageCreateTrueColor($thumbWidth,$thumbHeight);
//Einfügen des Bildes in das temporäre Bild
ImageCopyResampled($tmpImg,$img,0,0,0,0,$thumbWidth, $thumbHeight, $width, $height);
 
//Das finale Thumbnail erstellen
$resImg = ImageCreateTrueColor($resWidth, $resHeight);
//Das neue Bild mit schwarz füllen
ImageFill($resImg, 0, 0, ImageColorAllocate($resImg,  0, 0, 0));
//Das temporäre Bild in das Thumbnail einfügen
imagecopymerge($resImg,$tmpImg,$xAnfang,$yAnfang,0,0,$resWidth,$resHeight,100);
 
switch($typ)
{
    //Wenn das Bild ein GIF ist...
    case 1:
        //Abspeichern des neuen Bildes
        ImageGIF($resImg,$pfad.$thumb);
    break;
    //Wenn das Bild ein JPG ist...
    case 2:
        //Abspeichern des neuen Bildes
        ImageJPEG($resImg,$pfad.$thumb);
    break;
    //Wenn das Bild ein PNG ist...
    case 3:
        //Abspeichern des neuen Bildes
        ImagePNG($resImg,$pfad.$thumb);
    break;
}
 
?>

ACHTUNG: Das Script wurde mit Sicherheit zu genüge getestet, ich habe es jetzt allerdings nicht noch einmal zum Leben erweckt.

Filed under: PHP
Comments (6) Trackbacks (1)
  1. El_schnorroNo Gravatar
    19:38 on April 19th, 2008

    Vielen Dank für das tolle Skript. Ich werde es auf meiner künftigen Seite verwenden und zu diesem Post hier verlinken.

    Gute Arbeit! MfG El_Schnorro

  2. XeroNo Gravatar
    21:35 on October 5th, 2009

    Tolles script! Danke danach hab ich lange gesucht, weil meine thumbnail datei immer alles zusammengepresst hat :D

  3. MarcNo Gravatar
    20:20 on June 15th, 2011

    Hey :) tolles Skript, funktioniert spitze, jedoch möcht ich das thumbnail nicht schwarz sondern mit weiß füllen,

    also statt: //Das neue Bild mit schwarz füllen ImageFill($resImg, 0, 0, ImageColorAllocate($resImg, 0, 0, 0));”

    //Das neue Bild mit weiß füllen ImageFill($resImg, 0, 0, ImageColorAllocate($resImg, 255, 255, 255));”

    Nun werden aber bei mir bilder die Höher als Breiter sind , nicht ganz weiß sondern nur die linke seite, bis zum Image :( die rechte Seite bleibt schwarz. woran kann denn das liegen ? Und nochmals tolles script :D !

  4. marioNo Gravatar
    13:12 on August 30th, 2011

    Das mit den weißen Streifen hab ich auch, hat da eventuell jemand eine Lösung für? Ansonsten Danke für das Script.

  5. AndyNo Gravatar
    15:30 on January 6th, 2012

    Hallo, ich hatte das Problem mit dem Schwarzen Streifen auf der rechten Seite, wenn man das Bild weiss färben will. Ich habs folgendermassen gelöst: //Das temporäre Bild in das Thumbnail einfügen imagecopymerge($resImg,$tmpImg,$xAnfang,$yAnfang,0,0,$resWidth,$resHeight,100); // Schwarzen Balken mit weiss füllen ImageFill($resImg, ($xAnfang+$thumbWidth), 0, ImageColorAllocate($resImg, 255, 255, 255));

    Also nach dem imagecopymerge() einfach nochmals den schwarzen Streifen mit weiss übermalt..

  6. PaddyNo Gravatar
    21:22 on January 20th, 2012

    Seeehr gutes Script!!!

    HAbe eeeetlich scripts gesucht, ausprobiert, und das ist das erste, welches so funktioniert, wie ich es mir vorstelle Viiieeeelen dank mein freund!!!