Визначте орієнтацію EXIF ​​та поверніть зображення за допомогою ImageMagick


82

Зображення Canon DSLR зберігають фотографії в альбомній орієнтації та використовують exif::orientationдля обертання.

Запитання: Як можна використовувати imagemagick для повторного збереження зображення у передбачувану орієнтацію з використанням даних орієнтації exif таким чином, що вони більше не вимагають відображення даних exif у правильній орієнтації?


php.net/manual/en/function.exif-read-data.php Витягніть параметр обертання, протестуйте його, поверніть зображення, якщо це необхідно.
Marc B

Відповіді:


131

Використовуйте автоматичний зорієнтувати варіант ImageMagick це convertзробити це.

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

Або використовуйте, mogrifyщоб робити це на місці

mogrify -auto-orient your-image.jpg

12
Не забувайте, що ви можете використовувати mogrifyзамість цього, convertякщо ви хочете замінити існуючий файл (на місці), що корисно, коли ви хочете зробити каталог повним.
zanedp

1
Здається, це не працює у всіх випадках. У мене є принаймні випадок, коли GIMP запитує мене, чи хочу я виправити обертання, але перетворення просто залишає зображення таким, яке воно є (залишаючи реальну верхню частину зображення в правій частині).
xarlymg89

49

Спосіб PHP Imagick полягає у тестуванні орієнтації зображення та відповідному обертанні / перевертанні зображення:

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);
}

Функцію можна використовувати так:

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

2
Це рішення працює! Я спробував лише 1 зображення, і їх, звичайно, 8, але я повідомлю вам, як це відбувається. Для мене це було rotateImage, -> повертати просто ламається
Jack Franzen

3
Дякую, виправили rotateImageречі. Якщо ви хочете перевірити всі орієнтації: існує акуратне репозиторій github, який має зображення для кожного значення exif.
тарлеб

Дякую! працював у c #. мені просто знадобилося невелике перетворення.
Елвін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.