Erkennen Sie die EXIF-Ausrichtung und drehen Sie das Bild mit ImageMagick


80

Canon DSLRs scheinen Fotos im Querformat zu speichern und werden exif::orientationfür die Drehung verwendet.

Frage: Wie kann imagemagick verwendet werden, um das Bild unter Verwendung der Exif-Orientierungsdaten in die beabsichtigte Ausrichtung zu speichern, sodass die Exif-Daten nicht mehr in der richtigen Ausrichtung angezeigt werden müssen?


php.net/manual/en/function.exif-read-data.php Extrahieren Sie den Rotationsparameter, testen Sie ihn und drehen Sie das Bild bei Bedarf.
Marc B

Antworten:


130

Verwenden Sie dazu die Auto-Orient- Option von ImageMagick convert.

convert your-image.jpg -auto-orient output.jpg

Oder verwenden mogrifySie es, um es an Ort und Stelle zu tun

mogrify -auto-orient your-image.jpg

12
Vergessen Sie nicht, dass Sie mogrifyanstelle von verwenden können, convertwenn Sie die vorhandene Datei (an Ort und Stelle) ersetzen möchten. Dies ist nützlich, wenn Sie ein vollständiges Verzeichnis erstellen möchten.
Zanedp

1
Scheint nicht in allen Fällen zu funktionieren. Ich habe zumindest einen Fall, in dem GIMP mich fragt, ob ich die Drehung korrigieren möchte, aber beim Konvertieren bleibt das Bild so wie es ist (wobei der reale obere Teil des Bildes im rechten Teil verbleibt).
Xarlymg89

49

Der PHP Imagick-Weg wäre, die Bildausrichtung zu testen und das Bild entsprechend zu drehen / zu drehen:

function autorotate(Imagick $image)
{
    switch ($image->getImageOrientation()) {
    case Imagick::ORIENTATION_TOPLEFT:
        break;
    case Imagick::ORIENTATION_TOPRIGHT:
        $image->flopImage();
        break;
    case Imagick::ORIENTATION_BOTTOMRIGHT:
        $image->rotateImage("#000", 180);
        break;
    case Imagick::ORIENTATION_BOTTOMLEFT:
        $image->flopImage();
        $image->rotateImage("#000", 180);
        break;
    case Imagick::ORIENTATION_LEFTTOP:
        $image->flopImage();
        $image->rotateImage("#000", -90);
        break;
    case Imagick::ORIENTATION_RIGHTTOP:
        $image->rotateImage("#000", 90);
        break;
    case Imagick::ORIENTATION_RIGHTBOTTOM:
        $image->flopImage();
        $image->rotateImage("#000", 90);
        break;
    case Imagick::ORIENTATION_LEFTBOTTOM:
        $image->rotateImage("#000", -90);
        break;
    default: // Invalid orientation
        break;
    }
    $image->setImageOrientation(Imagick::ORIENTATION_TOPLEFT);
}

Die Funktion könnte folgendermaßen verwendet werden:

$img = new Imagick('/path/to/file');
autorotate($img);
$img->stripImage(); // if you want to get rid of all EXIF data
$img->writeImage();

2
Diese Lösung funktioniert! Ich habe nur 1 Bild ausprobiert und es gibt natürlich 8, aber ich werde Sie wissen lassen, wie es geht. Für mich war es rotateImage, -> nur Pausen drehen
Jack Franzen

3
Danke, habe das rotateImageZeug repariert. Wenn Sie alle Ausrichtungen testen möchten: Es gibt ein ordentliches Github-Repo das für jeden Exif-Wert ein Bild enthält.
Tarleb

Vielen Dank! arbeitete in c #. Ich brauchte nur eine kleine Umstellung.
Alvin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.