Определите ориентацию EXIF ​​и поверните изображение с помощью ImageMagick


83

Цифровые зеркальные камеры Canon сохраняют фотографии в альбомной ориентации и используют их exif::orientationдля вращения.

Вопрос: Как можно использовать imagemagick для повторного сохранения изображения в заданной ориентации с использованием данных ориентации exif, чтобы данные exif больше не отображались в правильной ориентации?


php.net/manual/en/function.exif-read-data.php Извлеките параметр поворота, проверьте его, поверните изображение, если необходимо.
Marc B

Ответы:


132

Для этого используйте опцию автоматической ориентации ImageMagick convert.

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

Или используйте, mogrifyчтобы сделать это на месте

mogrify -auto-orient your-image.jpg

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

1
Не во всех случаях работает. У меня, по крайней мере, есть случай, когда GIMP спрашивает меня, хочу ли я исправить поворот, но convert просто оставляет изображение как есть (оставляя реальную верхнюю часть изображения в правой части).
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, -> rotate just breaks
Джек Франзен

3
Спасибо, исправил rotateImage. Если вы хотите проверить все ориентации: существует аккуратное репозиторий на github, в котором есть изображение для каждого значения exif.
tarleb

благодаря! работал в c #. мне просто нужно было немного преобразовать.
Элвин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.