Inhaltsbasierte Größenänderung mit PHP & ImageMagick
In diesem Beitrag untersuchen wir eine leistungsstarke Technik, um Bilder mit PHP und ImageMagick inhaltsbasiert in der Größe zu ändern. Mit der Liquid-Rescale-Funktion, die über die Imagick-Erweiterung verfügbar ist, passen Sie Bildabmessungen intelligent an und bewahren dabei wichtige Details.
Was ist inhaltsbasierte Größenänderung?
Inhaltsbasierte Größenänderung, oft auch als Seam Carving bezeichnet, ermöglicht es Ihnen, Bildabmessungen anzupassen, indem Pixel in Bereichen mit weniger wichtigen visuellen Informationen entfernt oder eingefügt werden, statt das gesamte Bild gleichmäßig zu skalieren. Anders als herkömmliche Verfahren zur Größenänderung minimiert dieser Ansatz Verzerrungen des Motivs in Ihren Bildern.
Voraussetzungen
Bevor Sie beginnen, stellen Sie sicher, dass Sie über Folgendes verfügen:
- Eine unterstützte Version von PHP 8.x
- Die Imagick-Erweiterung, die in Ihrer PHP-Installation aktiviert ist
- ImageMagick ab Version 6.5.3-10 (sowohl Version 6 als auch 7 werden unterstützt)
Zusätzliche Voraussetzungen
Für die inhaltsbasierte Größenänderung:
- Die Bibliothek liblqr muss installiert sein (Paket
liblqr-1-0unter Debian/Ubuntu) - ImageMagick muss mit liblqr-Unterstützung kompiliert sein
Liquid Rescale in PHP verwenden
ImageMagick stellt die Methode liquidRescaleImage bereit, die eine inhaltsbasierte
Größenänderung durchführt. So setzen Sie sie in einem lokalen CLI-Skript mit einem
vertrauenswürdigen Einzelbild-JPEG um:
<?php
$image = new Imagick();
try {
$image->readImage('input.jpg');
// Define your target dimensions
$targetWidth = 400;
$targetHeight = 300;
// Parameters for liquid rescale
$deltaX = 1; // Maximum sideways step of a seam
$rigidity = 0; // Penalty for bending a seam
// Perform content-aware resizing
$image->liquidRescaleImage($targetWidth, $targetHeight, $deltaX, $rigidity);
// Write the result
$image->writeImage('output.jpg');
} catch (ImagickException $e) {
fwrite(STDERR, "Image resizing failed.\n");
$failed = true;
} finally {
$image->clear();
}
if (isset($failed)) {
exit(1);
}
Feinabstimmung der Parameter
Der Liquid-Rescale-Vorgang wird von zwei zentralen Parametern gesteuert:
- deltaX: Maximaler seitlicher Schritt einer Naht. Null erzeugt gerade Nähte; größere Werte geben den Nähten mehr Freiheit, sich um Bildinhalte herum zu bewegen.
- rigidity: Ein nicht negativer Malus für das Krümmen von Nähten. Null fügt keinen Malus hinzu; größere Werte bevorzugen geradere Nähte. Das garantiert nicht, dass ein Gesicht oder ein anderes wichtiges Merkmal erhalten bleibt.
Diese Bedeutungen stammen aus der Dokumentation der Imagick-Parameter. Prüfen Sie bei der Wahl der Werte das Ergebnis anhand repräsentativer Bilder.
Überlegungen zur Performance
Inhaltsbasierte Größenänderung kann ressourcenintensiv sein, insbesondere bei großen Bildern. Hier sind einige Optimierungsstrategien:
- Reduzieren Sie die Eingabeabmessungen vor dem Seam Carving, wenn die ursprüngliche Auflösung nicht erforderlich ist
- Setzen Sie Queue-Systeme für die Stapelverarbeitung ein
- Kombinieren Sie die normale Größenänderung mit Liquid Rescale:
<?php
$image = new Imagick();
try {
$image->readImage('input.jpg');
// Initial standard resize
$image->resizeImage(800, 600, Imagick::FILTER_LANCZOS, 1, true);
// Follow with content-aware adjustment
$image->liquidRescaleImage(400, 300, 1, 0);
$image->writeImage('optimized-output.jpg');
} catch (ImagickException $e) {
fwrite(STDERR, "Image resizing failed.\n");
$failed = true;
} finally {
$image->clear();
}
if (isset($failed)) {
exit(1);
}
Häufige Probleme und Lösungen
Fehler bei der Speicherzuweisung
Die Einstellung memory_limit von PHP begrenzt die nativen Speicherzuweisungen von
ImageMagick nicht zuverlässig. Konfigurieren Sie die
Ressourcenlimits und die Sicherheitsrichtlinie von ImageMagick
passend zu Ihrer Auslastung, einschließlich Arbeitsspeicher, Festplatten-Cache, Abmessungen und
Verarbeitungszeit. Machen Sie Fehler durch Ressourcenlimits sichtbar, statt die Verarbeitung
desselben übergroßen Bildes endlos zu wiederholen.
Fehlende Liblqr-Unterstützung
Überprüfen Sie die Installation mit:
magick -list configure | grep -i lqr
Verwenden Sie bei ImageMagick 6 convert anstelle von magick. Achten Sie in den konfigurierten Delegates auf lqr.
Die CLI und die PHP-Erweiterung können unterschiedliche ImageMagick-Builds verwenden; prüfen Sie daher auch php --ri imagick.
Wenn dem Build, der mit Imagick verknüpft ist, liblqr fehlt, installieren Sie einen Build mit diesem
Delegate und starten Sie PHP neu.
Qualitätserhalt
Bei deutlichen Größenreduzierungen:
- Führen Sie mehrere schrittweise Größenänderungen durch
- Kombinieren Sie sie nach der Größenänderung mit Schärfungsfiltern
- Behalten Sie nach Möglichkeit das ursprüngliche Seitenverhältnis bei
Fazit
Inhaltsbasierte Größenänderung ermöglicht es Ihnen, die Bildintegrität zu wahren, während Sie die Abmessungen anpassen, um wichtige Bereiche in den Fokus zu rücken. Wenn Sie PHP mit der Liquid-Rescale-Funktion von ImageMagick kombinieren, können Sie adaptive Lösungen für die Bildverarbeitung erstellen, die auf visuelle Inhalte reagieren.
Für Anforderungen an die Bildverarbeitung im Unternehmensmaßstab bietet sich Transloadits Bildverarbeitungs-API an, die komplexe Workflows automatisch abwickelt.
Viel Spaß beim Programmieren!
