Grafikfunktion - Bilder dynamisch skalieren

Damit das bearbeiten von Grafiken mit PHP funktioniert, muss dieses uch mit GD-UNterstützung installiert worden sein. Auf Linux bedeutet das, man muss dies als Optionflag beim kompilieren mitangeben, auf Windows muss man die nötige .exe mitinstallieren. Tiefergehende Informationen gibts hier.

Dieses Tutorium setzt vorraus, dass man die Grundlagen der Grafikfunktionen unter PHP verstanden hat, also zum Beispiel weiß, was ein Bild-Strom ist, und wie man mit diesem umgeht. Für jene, die das noch nicht kennen, gibt es hier auf Webstylez das Tutorium "Grundlagen der GD-Grafikbearbeitung".

Hintergrund
Die Funktion auf welcher das ganze Konzept des bildgrößen-veränderns aufbaut, ist die ab PHP Version 4.0.6 verfügbare Funktion ImageCopyResampled. Diese Funktion macht es möglich einen vorhandenen Bild-Strom in einen neuen zu kopieren und dabei die Abmessungen des Bildes anzupassen, aber auch die Position zu verändern, worauf ich aber nicht näher eingehen werde. Zusätzlich legt diese Funktion einen schwachen Weichzeichner über das Bild, wie es etwa Photshop und GIMP machen, wenn man dort ein Bild skaliert, sodass etwa entstehende Pixelfehler sanft übergangen werden und die Harmonie in der Grafik nicht gestört wird.

Anwendung
ImageCopyResampled(
Ziel-Bild-Strom,
Ursprungs-Bild-Strom,
Ziel-X-Koordinate,
Ziel-Y-Koordinate,
Ursprungs-X-Koordinate,
Ursprungs-Y-Koordinate,
Ziel-Breite,
Ziel-Höhe,
Ursprungs-Breite,
Ursprungs-Höhe
)

Die roten Angaben betreffen den Ziel-Bild-Strom, also den Strom des neuen Bildes. Blau sind die Angaben des Ursprungs-Stromes, also dem Bild aus dem heraus kopiert wird.

Umsetzung
Vorgang
Zuerst öffnen wir den Strom zur existierenden Bild-Datei. Wir benutzen die Funktion GetImageSize um die aktuellen Abmessungen und das Bild-Format zu erfahren. Je nachdem welches Bild-Format vorliegt müssen wirja einen anderen Strom erzeugen. Technisch ist es nicht möglich, die Abmessungen von ein und dem selben Bild direkt zu verändern. Wir müssen ein neues Bild generieren, das alte kopieren, und dann mit der ImageCopyResampled das Kopierte in seine neue Größe bringen. Die ImageCopyResampled kann dabei den Auszug aus dem Urspungs-Bild nicht einfach in sowas wie die Zwischen-Ablage kopieren, wir müssen die Kopie sofort in einen neuen Bild-Strom legen, diesen müssen wir vorher anlegen. Er sollte natürlich bereits die neuen Abmessungen haben. Danach geben wir den neuen Bildstrom aus.

Quelltext
<?php
$pfad = 'pfad/zum/bild.jpg'; // .jpg, .gif oder .png
$alte_daten = GetImageSize($pfad);
$alte_breite = $alte_daten[0];
$alte_hoehe = $alte_daten[1];

//Neue maximale Abmessungen
$neue_breite = 400;
$neue_hoehe = 300;

//Seiten-Verhältnisse anpassen
if ($alte_breite > $neue_breite) {
$breite = $neue_breite;
$hoehe = (($alte_hoehe/$alte_breite)*$neue_breite);
} elseif ($alte_hoehe > $neue_hoehe) {
$breite = (($alte_breite/$alte_hoehe)*$neue_hoehe);
$hoehe = $neue_hoehe;
} else { // Wenn das Bild sowieso kleiner ist, bleibt alles gleich
$breite = $alte_breite;
$hoehe = $alte_hoehe;
}

switch ($alte_daten[2]) {
case 1: $altes_bild = ImageCreateFromGIF($pfad); break; // Einen Bild-Strom aus eine GIF-Datei erzeugen
case 2: $altes_bild = ImageCreateFromJPEG($pfad); break; // -"- JPG
case 3: $altes_bild = ImageCreateFromPNG($pfad); break; // -"- PNG
}

$neues_bild = ImageCreateTrueColor($breite, $hoehe);
ImageCopyResampled($neues_bild, $altes_bild, 0, 0, 0, 0, $breite, $hoehe, $alte_breite, $alte_hoehe);

switch ($alte_daten[2]) {
case 1: ImageGIF($neues_bild, $pfad, 100); break;
case 2: ImageJPEG($neues_bild, $pfad, 100); break;
case 3: ImagePNG($neues_bild, $pfad, 100); break;
}
?>


Nachwort
Diese Funktion erstellt nicht, wie du vielleicht gemerkt hast ein Bild mit den Abmessungen 400*300, sondern es überprüft ob die Breite über dem Grenzwert liegt und passt die Abmessungen dann verhältnisgemäß an oder ob das Selbe mit der Höhe vielleicht nötig ist. Das Seitenverhalten von Höhe zu Breite wird also beibehalten, sodass das Bild nicht verzerrt wird.

Kommentare

cschaetzle
cschaetzle am Montag, 23. Januar 2006 um 14:20

Deine Tutorials sind einfach klasse und werden immer noch besser

unkie
unkie am Sonntag, 25. Februar 2007 um 11:58

wow der erste spammbot sucht WS.net heim :o

Markus René Einicher
Markus René Einicher am Montag, 26. Februar 2007 um 20:21

Und wurde bereits ausgeschlossen :)

Externe müssen ab jetzt eine Rechenaufgabe meistern damit sie kommentieren können :)

the master of pcs am Freitag, 4. Mai 2007 um 11:25

hgalllo