Signatur
Beschreibung
imagescale() skaliert ein bestehendes GD-Bild auf eine neue Größe. Wird für den Parameter $height der Wert -1 übergeben (Standard), berechnet PHP die Höhe automatisch, sodass das Seitenverhältnis des Originalbildes erhalten bleibt. Das ist besonders praktisch, wenn man Thumbnails oder responsive Bilder erzeugen möchte, ohne das Bild zu verzerren.
Der Parameter $mode bestimmt den Algorithmus, der bei der Skalierung verwendet wird. Zur Auswahl stehen IMG_NEAREST_NEIGHBOUR (schnell, aber kantiger), IMG_BILINEAR_FIXED (Standardwert, gutes Gleichgewicht zwischen Qualität und Geschwindigkeit) sowie IMG_BICUBIC und IMG_BICUBIC_FIXED für höhere Qualität bei etwas mehr Rechenaufwand. Für die meisten Anwendungsfälle liefert IMG_BILINEAR_FIXED zufriedenstellende Ergebnisse.
Im Unterschied zu imagecopyresampled() arbeitet imagescale() direkt auf einem einzelnen Bild ohne manuelles Anlegen eines Zielbildes und ist damit deutlich bequemer in der Handhabung. Das Originalbild bleibt dabei unverändert; das Ergebnis wird als neues GdImage-Objekt zurückgegeben.
Typische Einsatzgebiete sind die Erzeugung von Vorschaubildern beim Upload, die dynamische Bildverkleinerung für Webanwendungen sowie die Aufbereitung von Bildern für verschiedene Ausgabeformate und -größen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $image Pflicht | GdImage | Das GD-Bildobjekt, das skaliert werden soll. Wird typischerweise durch Funktionen wie imagecreatefromjpeg(), imagecreatefrompng() oder ähnliche erzeugt. |
|
| $width Pflicht | int | Die gewünschte Breite des skalierten Bildes in Pixeln. Muss ein positiver ganzzahliger Wert sein. | |
| $height | int | -1 | Die gewünschte Höhe des skalierten Bildes in Pixeln. Wird -1 übergeben (Standard), wird die Höhe automatisch proportional zur angegebenen Breite berechnet, sodass das Seitenverhältnis erhalten bleibt. |
| $mode | int | IMG_BILINEAR_FIXED | Der Skalierungsalgorithmus. Mögliche Werte: IMG_NEAREST_NEIGHBOUR, IMG_BILINEAR_FIXED (Standard), IMG_BICUBIC, IMG_BICUBIC_FIXED oder IMG_MITCHELL. Höherwertige Algorithmen liefern qualitativ bessere Ergebnisse, benötigen aber mehr Rechenzeit. |
Rückgabewert
GdImage-Objekt mit dem skalierten Bild zurück. Im Fehlerfall wird false zurückgegeben, z. B. wenn ungültige Parameter übergeben wurden.Beispiele
Bild proportional auf 300 px Breite skalieren
<?php
// Original-JPEG laden
$original = imagecreatefromjpeg('foto.jpg');
if ($original === false) {
die('Bild konnte nicht geladen werden.');
}
// Auf 300 px Breite skalieren, Höhe wird proportional berechnet
$skaliert = imagescale($original, 300);
if ($skaliert === false) {
die('Skalierung fehlgeschlagen.');
}
// Skaliertes Bild als JPEG speichern
imagejpeg($skaliert, 'foto_klein.jpg', 85);
// Speicher freigeben
imagedestroy($original);
imagedestroy($skaliert);
echo 'Bild erfolgreich skaliert und gespeichert.';
Thumbnail mit festem Seitenverhältnis und Bicubic-Algorithmus erzeugen
<?php
// PNG-Bild laden
$original = imagecreatefrompng('banner.png');
if ($original === false) {
die('Bild konnte nicht geladen werden.');
}
// Auf exakt 200 x 100 Pixel skalieren (kann Verzerrung erzeugen)
// Bicubic-Algorithmus für bessere Qualität
$thumb = imagescale($original, 200, 100, IMG_BICUBIC);
if ($thumb === false) {
die('Skalierung fehlgeschlagen.');
}
// Ausgabe direkt an den Browser
header('Content-Type: image/png');
imagepng($thumb);
// Speicher freigeben
imagedestroy($original);
imagedestroy($thumb);
Hochgeladenes Bild als Vorschau speichern
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['bild'])) {
$tmpFile = $_FILES['bild']['tmp_name'];
$mimeType = mime_content_type($tmpFile);
// Bild je nach MIME-Typ laden
$original = match ($mimeType) {
'image/jpeg' => imagecreatefromjpeg($tmpFile),
'image/png' => imagecreatefrompng($tmpFile),
'image/gif' => imagecreatefromgif($tmpFile),
default => false,
};
if ($original === false) {
die('Nicht unterstütztes Bildformat.');
}
// Vorschaubild: max. 150 px Breite, proportionale Höhe
$preview = imagescale($original, 150, -1, IMG_BILINEAR_FIXED);
if ($preview !== false) {
imagejpeg($preview, 'uploads/preview_' . basename($_FILES['bild']['name']), 80);
imagedestroy($preview);
echo 'Vorschaubild wurde gespeichert.';
}
imagedestroy($original);
}
// Wichtig · Fallstricke
Wichtig: imagescale() gibt ein neues Bildobjekt zurück und verändert das Originalbild nicht. Vergessen Sie nicht, sowohl das Original als auch das skalierte Bild mit imagedestroy() freizugeben, um Speicherlecks zu vermeiden.
Werden sowohl $width als auch $height explizit angegeben, wird das Bild auf genau diese Maße gebracht – dies kann das Seitenverhältnis verzerren. Um Verzerrungen zu vermeiden, sollte man entweder nur die Breite angeben ($height = -1) oder das gewünschte Verhältnis selbst berechnen.
Bei der Verarbeitung von Nutzereingaben (z. B. hochgeladene Bilder) sollten Sie stets den MIME-Typ serverseitig validieren und keine unkontrollierten Dateinamen oder Pfade verwenden, um Path-Traversal- und Code-Injection-Angriffe zu vermeiden.