Start · Sprachen · PHP · Referenz · imagecopyresampled

imagecopyresampled

Funktion

Kopiert einen rechteckigen Bereich aus einem Quellbild in ein Zielbild und skaliert diesen dabei mit bilinearer Interpolation (Resampling) für qualitativ hochwertige Ergebnisse.

seit PHP 4.0.6 Kategorie: image

Signatur

imagecopyresampled(GdImage $dst_image, GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): bool

Beschreibung

imagecopyresampled() kopiert einen rechteckigen Ausschnitt aus einem Quellbild (src_image) in ein Zielbild (dst_image) und skaliert ihn dabei auf die gewünschte Zielgröße. Im Gegensatz zu imagecopyresized() verwendet diese Funktion bilineares Resampling, was zu wesentlich glätteren und qualitativ hochwertigeren Ergebnissen führt – besonders beim Verkleinern von Bildern.

Typische Einsatzgebiete sind das Erstellen von Vorschaubildern (Thumbnails), das Skalieren hochgeladener Bilder auf eine Standardgröße sowie das Ausschneiden und gleichzeitige Skalieren von Bildregionen. Die Funktion eignet sich sowohl für die Verkleinerung als auch die Vergrößerung von Bildinhalten.

Damit die Funktion korrekt arbeitet, muss das Zielbild (dst_image) zuvor mit einer der imagecreate*()-Funktionen erstellt und auf die gewünschte Ausgabegröße dimensioniert werden. Für Bilder mit Transparenz (PNG, GIF) sollte vor dem Kopieren imagealphablending() und imagesavealpha() am Zielbild gesetzt werden, um den Alphakanal korrekt zu übernehmen.

Die Quell- und Zielkoordinaten sowie -dimensionen ermöglichen präzises Cropping und Positionierung: Durch Angabe unterschiedlicher Quell- und Zielgrößen wird der kopierte Bereich automatisch auf die Zielgröße skaliert. Negative Breiten oder Höhen sind nicht erlaubt; für Spiegeleffekte kann jedoch ein anderer Ansatz gewählt werden.

Parameter

Name Typ Default Beschreibung
$dst_image Pflicht GdImage Das Zielbild-Ressource-Objekt, in das der Bildbereich kopiert wird. Muss vorab mit z. B. imagecreatetruecolor() erstellt worden sein.
$src_image Pflicht GdImage Das Quellbild-Ressource-Objekt, aus dem der Bildbereich entnommen wird.
$dst_x Pflicht int X-Koordinate der oberen linken Ecke im Zielbild, an der der kopierte Bereich eingefügt wird.
$dst_y Pflicht int Y-Koordinate der oberen linken Ecke im Zielbild, an der der kopierte Bereich eingefügt wird.
$src_x Pflicht int X-Koordinate der oberen linken Ecke des zu kopierenden Ausschnitts im Quellbild.
$src_y Pflicht int Y-Koordinate der oberen linken Ecke des zu kopierenden Ausschnitts im Quellbild.
$dst_width Pflicht int Breite des Zielbereichs in Pixeln. Der Quellausschnitt wird auf diese Breite skaliert.
$dst_height Pflicht int Höhe des Zielbereichs in Pixeln. Der Quellausschnitt wird auf diese Höhe skaliert.
$src_width Pflicht int Breite des zu kopierenden Ausschnitts im Quellbild in Pixeln.
$src_height Pflicht int Höhe des zu kopierenden Ausschnitts im Quellbild in Pixeln.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. ungültige Bildressourcen oder nicht unterstützte Parameter).

Beispiele

Thumbnail aus hochgeladenem Bild erstellen

<?php
// Originalbild laden (z. B. JPEG)
$src = imagecreatefromjpeg('foto.jpg');

// Originalgröße ermitteln
$src_width  = imagesx($src);
$src_height = imagesy($src);

// Zielgröße: max. 200×200 Pixel, Seitenverhältnis beibehalten
$max = 200;
$ratio = min($max / $src_width, $max / $src_height);
$dst_width  = (int) round($src_width  * $ratio);
$dst_height = (int) round($src_height * $ratio);

// Zielbild erstellen
$dst = imagecreatetruecolor($dst_width, $dst_height);

// Skaliert kopieren mit Resampling
imagecopyresampled(
    $dst, $src,
    0, 0,           // Zielposition (oben links)
    0, 0,           // Quellposition (oben links)
    $dst_width, $dst_height,  // Zielgröße
    $src_width, $src_height   // Quellgröße
);

// Thumbnail als JPEG speichern
imagejpeg($dst, 'thumbnail.jpg', 85);

imagedestroy($src);
imagedestroy($dst);
echo 'Thumbnail erstellt: ' . $dst_width . 'x' . $dst_height . ' Pixel';
Thumbnail erstellt: 200x133 Pixel

PNG mit Transparenz korrekt skalieren

<?php
// Transparentes PNG laden
$src = imagecreatefrompng('logo.png');
$src_width  = imagesx($src);
$src_height = imagesy($src);

// Zielgröße halbieren
$dst_width  = (int) ($src_width  / 2);
$dst_height = (int) ($src_height / 2);

// Zielbild erstellen
$dst = imagecreatetruecolor($dst_width, $dst_height);

// Transparenz am Zielbild korrekt konfigurieren
imagealphablending($dst, false);
imagesavealpha($dst, true);

// Transparenten Hintergrund füllen
$transparent = imagecolorallocatealpha($dst, 0, 0, 0, 127);
imagefilledrectangle($dst, 0, 0, $dst_width, $dst_height, $transparent);

// Skaliert kopieren
imagecopyresampled(
    $dst, $src,
    0, 0,
    0, 0,
    $dst_width, $dst_height,
    $src_width, $src_height
);

// Skaliertes PNG speichern
imagepng($dst, 'logo_klein.png', 9);

imagedestroy($src);
imagedestroy($dst);
echo 'PNG mit Transparenz skaliert gespeichert.';
PNG mit Transparenz skaliert gespeichert.

// Wichtig · Fallstricke

Qualität vs. Geschwindigkeit: imagecopyresampled() ist qualitativ hochwertiger als imagecopyresized(), aber auch etwas langsamer. Für Anwendungen, bei denen Bildqualität wichtig ist (z. B. Fotoplattformen), sollte stets imagecopyresampled() bevorzugt werden.

Transparenz: Bei PNG- und GIF-Bildern mit Transparenzkanal muss das Zielbild explizit mit imagealphablending($dst, false) und imagesavealpha($dst, true) konfiguriert werden, sonst geht die Transparenz verloren und wird durch einen schwarzen Hintergrund ersetzt.

Speicherbedarf: Das Verarbeiten großer Bilder kann sehr viel Arbeitsspeicher verbrauchen. Bei unkontrollierten Datei-Uploads sollte das memory_limit in der php.ini berücksichtigt und ggf. ini_set('memory_limit', '256M') gesetzt werden. Außerdem sollte die Bildgröße vor dem Laden geprüft werden, um Denial-of-Service-Angriffe (z. B. durch sehr große Bilder) zu verhindern.

Ressourcen freigeben: Nach der Verarbeitung sollten alle Bildressourcen mit imagedestroy() freigegeben werden, um Speicherlecks zu vermeiden – besonders bei der Verarbeitung vieler Bilder in einer Schleife.