Arbeiten mit Bildern in PHP: Resize, Crop und Optimierung
\n\nDie Bildverarbeitung ist eine der Kernaufgaben bei der Entwicklung von Webanwendungen. Ob Benutzeravatare, Vorschaubilder für Nachrichten oder Produktgalerien – fast immer müssen Sie Bilder in der Größe ändern (resize) und zuschneiden (crop). In PHP gibt es dafür zwei Hauptbibliotheken: GD (integriert) und Imagick (eine Erweiterung auf Basis von ImageMagick).
\n\nIn diesem Artikel behandeln wir beide Ansätze, zeigen funktionierende Codebeispiele und geben Empfehlungen, welche Bibliothek Sie für Ihr Projekt wählen sollten.
\n\n1. Die GD-Bibliothek (GDLib)
\n\nGD ist eine standardmäßige PHP-Erweiterung, die auf fast jedem Hosting verfügbar ist. Sie unterstützt die gängigen Formate: JPEG, PNG, GIF, WEBP (ab PHP 7.1+). Ein Nachteil ist die geringere Qualität des Resamplings im Vergleich zu Imagick, aber für die meisten Aufgaben reichen ihre Fähigkeiten aus.
\n\n1.1. Größe ändern (Resize) mit GD
\n\nDie Funktion imagecopyresampled() erstellt ein neues Bild mit Interpolation (Glättung). Ein Beispiel für die Skalierung auf eine Breite von 300px unter Beibehaltung der Proportionen:
<?php\nfunction resizeImageGD($srcFile, $destFile, $newWidth = 300) {\n // Abmessungen des Quellbildes ermitteln\n list($width, $height, $type) = getimagesize($srcFile);\n \n // Ressource des Quellbildes je nach Typ erstellen\n switch ($type) {\n case IMAGETYPE_JPEG:\n $src = imagecreatefromjpeg($srcFile);\n break;\n case IMAGETYPE_PNG:\n $src = imagecreatefrompng($srcFile);\n break;\n case IMAGETYPE_GIF:\n $src = imagecreatefromgif($srcFile);\n break;\n default:\n return false;\n }\n \n // Neue Höhe proportional berechnen\n $ratio = $width / $height;\n $newHeight = intval($newWidth / $ratio);\n \n // Leeres Bild mit der gewünschten Größe erstellen\n $dst = imagecreatetruecolor($newWidth, $newHeight);\n \n // Alphakanal für PNG/GIF aktivieren\n imagealphablending($dst, false);\n imagesavealpha($dst, true);\n \n // Resampling (Kopieren mit Pixel-Neuberechnung)\n imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);\n \n // Ergebnis speichern\n imagejpeg($dst, $destFile, 85); // Qualität 85%\n \n // Speicher freigeben\n imagedestroy($src);\n imagedestroy($dst);\n \n return true;\n}\n\n// Verwendung:\nresizeImageGD('photo.jpg', 'photo_thumb.jpg', 300);\n?>\n\n1.2. Zuschneiden (Crop) mit GD
\n\nZum Zuschneiden verwenden wir die Funktion imagecopy() oder imagecopyresampled() mit Angabe des Bereichs. Beispiel – wir schneiden ein zentrales Quadrat von 200x200 aus:
<?php\nfunction cropCenterGD($srcFile, $destFile, $cropSize = 200) {\n list($width, $height, $type) = getimagesize($srcFile);\n \n // Typ bestimmen\n $src = imagecreatefromjpeg($srcFile); // für das Beispiel JPEG\n \n // Koordinaten des zentralen Quadrats berechnen\n $x = ($width - $cropSize) / 2;\n $y = ($height - $cropSize) / 2;\n \n // Wenn das Quellbild kleiner als die Zuschnittgröße ist – nicht zuschneiden\n if ($width < $cropSize || $height < $cropSize) {\n $cropSize = min($width, $height);\n $x = 0;\n $y = 0;\n }\n \n $dst = imagecreatetruecolor($cropSize, $cropSize);\n imagecopy($dst, $src, 0, 0, $x, $y, $cropSize, $cropSize);\n \n imagejpeg($dst, $destFile, 90);\n imagedestroy($src);\n imagedestroy($dst);\n}\n\ncropCenterGD('photo.jpg', 'cropped.jpg', 200);\n?>\n\n2. Die Imagick-Bibliothek
\n\nImagick ist eine leistungsstarke Erweiterung, die eine objektorientierte Schnittstelle zu ImageMagick bietet. Sie unterstützt über 200 Formate, hervorragende Resampling-Qualität, Arbeit mit Farben, Filtern und Animationen. Sie muss auf dem Server installiert werden (nicht immer auf günstigem Hosting verfügbar).
Auch in der Bibliothek
CLI-Frameworks für PHP: Erstellung von Konsolenanwendungen mit Symfony Console und Laravel Zero
Maschinelles Lernen mit C#: Bibliotheken ML.NET und Accord.NET
Maschinelles Lernen: TypeScript-Bibliotheken für Browser und Node.js