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?

Nyxynyx
quelle
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
dlemstra
quelle
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();
Tarleb
quelle
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