burghi'sphp-dummies.de
PHP für Einsteiger und Fortgeschrittenere - an laufenden Scripten erklärt
10.02.2012, 09:46 Uhr - Impressum
Sendet einen HTTP-Header in Rohform
Copy and resize part of an image with resampling
Kopieren und Ändern der Grösse eines Bild-Teiles
Erzeugt ein neues Bild im JPEG-Format, welches aus einer Datei oder von einer URL gelesen wird
Create a new true color image
Ausgabe des Bildes im Browser oder als Datei
Ermittelt die Bild-Breite
Ermittelt die Bild-Höhe

Tutorials - Fortgeschritten - Bilder und Thumbnails - Bilder verkleinern

Tutorials - Fortgeschritten
Bilder und Thumbnails: Bilder verkleinern
Als nächstes werden wir ein sehr großes Bild als kleines Bild anzeigen lassen.
Sozusagen das Prinzip des "Thumbnails"

Hierzu erstellen wir erst mal ein kleineres, neues, leeres Bild.

imageCreate() kann man sehr gut für kleine Grafiken oder so verwenden, für Fotos allerdings ungünstig.
Im Folgenden werd ich deswegen imageCreateTrueColor() verwenden.
Das neue Bild kann dann mehr mögliche Farben Farben - Echtfarben
<?php
header("Content-Type: image/jpeg");
$BILD = imageCreateTrueColor(100, 50);     /* vom Syntax her identisch zu imageCreate() */
imageJPEG($BILD);
?>
Wir haben bereits mit imageCopy() ein Bild ins andere kopiert.
Hier verwenden wir nun: imageCopyResized() - wir wollen ja die Größe ändern, resizen

Der Befehl ist im Großen und Ganzen identisch zu imageCopy(), hat aber Erweiterungen (blau markiert):

imageCopyResized (dst_im, src_im, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h)
dst_imdestination imagein welches Bild soll kopiert werden ? (hier in $BILD)
dst_xdestination xWertkopiere in das neue Bild, und lasse ... Bildpunkte links frei
dst_ydestination yWertkopiere in das neue Bild, und lasse ... Bildpunkte oben frei
src_xsource xWertdas ganze Quellbild ($ORIGINAL) soll kopiert werden ab ... Pixel von links
src_ysource xWertdas ganze Quellbild ($ORIGINAL) soll kopiert werden ab ... Pixel von oben
dst_wdestination widthder von source kopierte Bereich wird auf ... Pixel Breite skaliert
dst_hdestination heightder von source kopierte Bereich wird auf ... Pixel Höhe skaliert
src_wsource width... Bildpunkte in der Breite sollen vom Quellbild kopiert werden
src_hdestination image... Bildpunkte in der Höhe sollen vom Quellbild kopiert werden
benutzte Bilder gitarre.jpg
<?php
header("Content-Type: image/jpeg");
$ORIGINAL = imageCreateFromJPEG("images/gitarre.jpg");
$BILD = imageCreateTrueColor(307, 205);
imageCopyResized($BILD, $ORIGINAL,
               0, 0,     /* kopiere Original in Bild, an Stelle ( 0, 0) */
               0, 0,     /* Der zu kopierende Bereich beginnt in $ORIGINAL bei 0, 0 */
               307, 205,      /* am Ende der Verkleinerung / Vergrößerung soll der Bereich
                              307 Pixel breit und 205 Pixel hoch sein ( 1/10 des Originals ) */

               3072, 2048);      /* 3072 Bildpunkte in der Breite ( das ist die volle Breite ) und
                              2048 Bildpunkte in der Höhe sollen vom Quellbild kopiert werden */

imageJPEG($BILD);
?>
Die Reihenfolge der letzten beiden Zeilen, also die Größe Nachher und Größe Vorher finde ich persönlich sehr unglücklich, ich hätte es auch lieber andersrum...
Also benutze ich immer meine eigene kleine Funktion, die diese 4 Parameter tauscht (nur mal so...)

Weiter im Text.
Jetzt mal wieder weg von den absoluten Zahlen, wer weiss, vielleicht wollen wir ja mal ein Bild verkleinern, von dem wir gar nicht die genaue Größe kennen.
Richtig - das sind nahezu 100%, es sei denn, man hat Lust, bei jedem Bild extra nachzuschauen.
Also lassen wir uns von PHP die Größe sagen:
benutzte Bilder gitarre.jpg
<?php
header("Content-Type: image/jpeg");
$ORIGINAL = imageCreateFromJPEG("images/gitarre.jpg");

$oBreite = imageSX($ORIGINAL);     /* Dies ist die Originalbreite */
$oHöhe = imageSY($ORIGINAL);     /* Dies ist die Originalhöhe */

$nBreite = $oBreite / 10;          /* Die neue Breite */
$nHöhe = $oHöhe / 10;               /* Die neue Höhe */

$BILD = imageCreateTrueColor($nBreite, $nHöhe);
imageCopyResized($BILD, $ORIGINAL,
               0, 0,
               0, 0,
               $nBreite, $nHöhe,
               $oBreite, $oHöhe);
imageJPEG($BILD);
?>
Vielleicht ist dir schon aufgefallen, dass das doch etwas dauert bis so ein Bild geschrumpft ist - bei dem sehr großen Beispielbild hier (immerhin 6 Megapixel) nahezu 2 bis 3 Sekunden.
Macht nix, das geht noch langsamer:
Mit imageCopyResampled() - Die Qualität des Bildes ist allerdings besser, das Bild wirkt nicht mehr so "körnig".
Der Syntax ist exakt der gleiche wie imageCopyResized().
Das fällt vor allem auf, wenn man das Bild sehr sehr klein schrumpft:
Wähle aus, wie das Bild erstellt werden soll:";
benutzte Bilder gitarre.jpg
gesetzt in $_POST 'useResampled', 'absenden'
<?php
header("Content-Type: image/jpeg");
$ORIGINAL = imageCreateFromJPEG("images/gitarre.jpg");

$oBreite = imageSX($ORIGINAL);     
$oHöhe = imageSY($ORIGINAL);     

$nBreite = $oBreite / 10;     /* nochmal kleiner das Bild */
$nHöhe = $oHöhe / 10;               

$BILD = imageCreateTrueColor($nBreite, $nHöhe);

if($_POST[useResampled] == 1) {
     imageCopyResampled($BILD, $ORIGINAL, 0, 0, 0, 0, $nBreite, $nHöhe, $oBreite, $oHöhe);
}
else {
     imageCopyResized($BILD, $ORIGINAL, 0, 0, 0, 0, $nBreite, $nHöhe, $oBreite, $oHöhe);
}

imageJPEG($BILD);
?>
Resized benutzen
Resampled benutzen
FormularQuelltext anzeigen
<html>
     <form method="post" action="/script.php">
          <input type="radio" name="useResampled" value="0" checked> 
          Resized benutzen<br />
          <input type="radio" name="useResampled" value="1">
          Resampled benutzen<br />
          <input type="submit" name="absenden" value="Script starten">
     </form>
</html>
© 2004-2005 - Impressum