使用ImageMagick检测EXIF方向并旋转图像


80

佳能单反相机似乎以横向保存照片,并用于exif::orientation旋转。

问题:如何使用exmag方位数据使用imagemagick将图像重新保存到预期的方位,从而不再需要exif数据以正确的方位显示?


php.net/manual/en/function.exif-read-data.php提取旋转参数,对其进行测试,并根据需要旋转图像。
Marc B

Answers:


130

使用ImageMagick的自动定向选项convert来执行此操作。

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

或用mogrify原地做

mogrify -auto-orient your-image.jpg

12
别忘了mogrifyconvert如果要替换现有文件(就地),可以使用代替,这对于要填充目录的情况很有用。
zanedp '16

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,-> rotate刚刚中断
Jack Franzen

3
谢谢,固定了rotateImage东西。如果要测试所有方向,请执行以下操作:有一个整洁的github存储库,其中每个exif值都有一个图像。
tarleb

谢谢!在C#中工作。我只需要一点转换。
艾尔文(Alvin)'18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.