Inhaltsbasierte Größenänderung mit PHP & ImageMagick
Mit Imagick::liquidRescaleImage() ändern Sie die Proportionen eines Bildes, ohne jedes Objekt
gleichmäßig zu strecken. Diese Anleitung erzeugt in PHP aus einem lokalen Bild ein JPEG im Format
400 × 300. Seam Carving kann leere Flächen um ein Motiv entfernen, aber auch das Motiv
selbst verzerren.
Was ist inhaltsbasierte Größenänderung?
Inhaltsbasierte Größenänderung, auch Seam Carving genannt, entfernt zusammenhängende Pixelpfade, die sogenannten Nähte, oder fügt sie ein. Sie bevorzugt Pfade mit geringeren visuellen Unterschieden. Ein strukturiertes Objekt vor einem schlichten Hintergrund kann seine Form behalten, während der Hintergrund schrumpft. Ein glattes Gesicht vor einem unruhigen Hintergrund kann dagegen verzerrt werden. Der Algorithmus erkennt nicht, welches Objekt Ihnen wichtig ist.
Voraussetzungen
Die folgende Einrichtung ist für Debian 13 mit PHP 8.4, Imagick 3.8 und ImageMagick 7 vorgesehen. Getestet wurden PHP 8.4.26, Imagick 3.8.0, ImageMagick 7.1.1-43 und liblqr 0.4.2. Nutzen Sie die gepflegten Updates Ihrer Distribution innerhalb dieser Versionsreihen. Die Patchnummern beschreiben die getestete Einrichtung und sind keine technisch erforderlichen Mindestversionen. PHP 8.4 wird unterstützt.
Installieren Sie als root unter Debian 13 die CLI- und Erweiterungspakete:
apt-get update &&
apt-get install -y --no-install-recommends php8.4-cli php8.4-imagick imagemagick liblqr-1-0
Debian stellt php8.4-imagick bereit.
Die Beispiele verwenden eine vertrauenswürdige, unbeschädigte RGB-JPEG-Datei mit einem einzelnen
Bild namens input.jpg in einem Arbeitsverzeichnis mit Schreibzugriff.
Bewahren Sie das Original auf. Upload-Validierung, Animationen und die Konvertierung von
Farbprofilen sind nicht Teil dieses lokalen CLI-Beispiels.
Zusätzliche Voraussetzungen
Die Installation von liblqr allein reicht nicht aus: Die ImageMagick-Bibliothek, mit der die Imagick-Erweiterung von PHP verknüpft ist, muss mit liblqr gebaut worden sein. Testen Sie die Operation direkt mit PHP, bevor Sie die Skripte speichern:
php -r '
$im = new Imagick();
$im->newImage(16, 16, "white");
$im->liquidRescaleImage(12, 16, 1, 0);
echo "Liquid rescale available\n";
'
Fahren Sie nur fort, wenn der Vorgang erfolgreich endet und Liquid rescale available ausgibt.
Fehlt eine Erweiterung oder ein Delegate, schlägt er vor dieser Meldung fehl. Falls die Installation
oder dieser Test fehlschlägt, beheben Sie die fehlende Voraussetzung und wiederholen Sie den
betreffenden Schritt. Bis dahin wurde noch keine Ausgabedatei aus dieser Anleitung erstellt.
Liquid Rescale in PHP verwenden
Speichern Sie dies als resize.php neben input.jpg.
Die beiden Zielmaße sind in Pixeln angegeben. Passen Sie sie an die gewünschte Ausgabe an.
<?php
$image = new Imagick();
try {
$image->readImage('input.jpg');
$targetWidth = 400;
$targetHeight = 300;
$deltaX = 1; // Maximum sideways step of a seam
$rigidity = 0; // Penalty for bending a seam
$image->liquidRescaleImage($targetWidth, $targetHeight, $deltaX, $rigidity);
$image->writeImage('output.jpg');
printf("Saved output.jpg (%d x %d)\n", $image->getImageWidth(), $image->getImageHeight());
} catch (ImagickException $e) {
fwrite(STDERR, "Image resizing failed.\n");
$failed = true;
} finally {
$image->clear();
}
if (isset($failed)) {
exit(1);
}
Führen Sie das Skript aus diesem Verzeichnis aus:
php resize.php
Bei erfolgreicher Ausführung wird Saved output.jpg (400 x 300) ausgegeben und ein JPEG im Format
400 × 300 geschrieben. Öffnen Sie es neben dem Original: Die Abmessungen bestätigen die
Zielgröße, aber nicht den Erhalt des Motivs. Erfolgreiche Ausführungen ersetzen
output.jpg. Bei ImagickException endet das Skript mit Status 1.
Dabei kann eine ältere Ausgabedatei bestehen bleiben. Prüfen Sie daher den Exit-Status, bevor Sie
die Datei verwenden.
Feinabstimmung der Parameter
Die Liquid-Rescale-Operation wird durch zwei zentrale Parameter gesteuert:
- deltaX: Maximaler seitlicher Schritt einer Naht. Null erzeugt gerade Nähte; größere Werte geben den Nähten mehr Spielraum, um Bildinhalten auszuweichen.
- rigidity: Ein nicht negativer Strafwert für das Biegen von Nähten. Null fügt keinen Strafwert hinzu; größere Werte begünstigen 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 das Ergebnis an repräsentativen Bildern, wenn Sie Werte auswählen.
Hinweise zur Leistung
Bei einem großen Original können Sie die Anzahl der Pixel für Seam Carving reduzieren, indem Sie
zuerst eine herkömmliche Größenänderung durchführen. Speichern Sie diese separate Version als
resize-small.php. Sie passt zu große Eingabebilder unter Beibehaltung des
Seitenverhältnisses in 800 × 600 ein und nutzt anschließend Seam Carving für 400 × 300.
Bei kleineren Eingabebildern überspringt sie die anfängliche Größenänderung. Ohne diese Schutzprüfung
kann bestfit: true sie vergrößern, wie in der
Dokumentation zu resizeImage beschrieben.
<?php
$image = new Imagick();
try {
$image->readImage('input.jpg');
if ($image->getImageWidth() > 800 || $image->getImageHeight() > 600) {
$image->resizeImage(800, 600, Imagick::FILTER_LANCZOS, 1, true);
}
$image->liquidRescaleImage(400, 300, 1, 0);
$image->writeImage('optimized-output.jpg');
printf("Saved optimized-output.jpg (%d x %d)\n", $image->getImageWidth(), $image->getImageHeight());
} catch (ImagickException $e) {
fwrite(STDERR, "Image resizing failed.\n");
$failed = true;
} finally {
$image->clear();
}
if (isset($failed)) {
exit(1);
}
php resize-small.php
Bei Erfolg wird Saved optimized-output.jpg (400 x 300) ausgegeben. Das Verhalten beim Ersetzen von Dateien
und bei Fehlern entspricht dem ersten Skript. Die anfängliche Größenänderung verkleinert auch das
Motiv, sodass die beiden Ausgaben unterschiedlich aussehen können. Ist das eingepasste Bild
schmaler als 400 Pixel oder niedriger als 300, vergrößert die abschließende Operation diese
Abmessung. Vergleichen Sie die Ergebnisse, bevor Sie sich für diesen Kompromiss entscheiden.
Schnellere Verarbeitung oder bessere Qualität sind damit nicht garantiert.
Häufige Probleme und Lösungen
Fehler bei der Speicherzuweisung
Der PHP-Parameter memory_limit begrenzt die nativen Speicherzuweisungen von
ImageMagick nicht zuverlässig. Konfigurieren Sie die
Ressourcengrenzen und Sicherheitsrichtlinie von ImageMagick passend
zu Ihrer Arbeitslast, einschließlich Arbeitsspeicher, Festplatten-Cache, Abmessungen und
Verarbeitungszeit. Geben Sie Fehler wegen überschrittener Ressourcengrenzen aus, statt dasselbe zu
große Bild unbegrenzt erneut zu verarbeiten.
Fehlende liblqr-Unterstützung
Prüfen Sie die Version, mit der die Erweiterung verknüpft ist, mit:
php --ri imagick
Die eigenständige ImageMagick-CLI kann einen anderen Build verwenden. Ein Delegate, den
magick oder convert von ImageMagick 6 auflistet,
beweist nicht, dass PHP ihn nutzen kann. Wiederholen Sie nach der Installation eines kompatiblen
Builds die PHP-Operation unter „Zusätzliche Voraussetzungen“. Starten Sie alle lang laufenden
PHP-Worker neu, die die alte Bibliothek verwenden. Die gespeicherten Skripte melden
Image resizing failed. und enden mit Exit-Status 1, wenn der Liquid-Rescale-Aufruf fehlschlägt.
Qualität erhalten
Beim Decodieren eines JPEGs können Teile einer beschädigten Datei wiederhergestellt und trotzdem eine Ausgabe erzeugt werden. Diese Skripte prüfen die Integrität der Eingabe nicht. Verwenden Sie ein unbeschädigtes Original und prüfen Sie das gesamte Ergebnis einschließlich des unteren Randes.
Prüfen Sie Gesichter, Schriftzüge, gerade Kanten und wiederkehrende Muster. Die Seam-Carving-Beispiele von ImageMagick erklären, warum unruhige Hintergründe dazu führen können, dass der Algorithmus stattdessen Pixel aus dem Vordergrund entfernt. Weder ein höherer Wert für rigidity noch das Schärfen schützt ein bestimmtes Motiv. Vergleichen Sie bei Fotos, deren Form wichtig ist, die Ergebnisse mit einer proportionalen Größenänderung oder einem ausdrücklich festgelegten Zuschnitt. Wählen Sie das Ergebnis, das die benötigten Inhalte bewahrt.
Zum Abschluss
Testen Sie das Skript an einigen Bildern aus Ihrer eigenen Arbeitslast, bevor Sie es auf einen Stapel anwenden. Entdecken Sie für gehostete Bildgrößenänderung und Formatkonvertierung die Bildverarbeitungs-API von Transloadit.
