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

111

佳能数码单反相机似乎以横向方向保存照片,并使用exif::orientation进行旋转。

问题:如何使用ImageMagick根据exif方向数据重新保存图像,使其不再需要exif数据即可正确显示方向?


提取旋转参数,测试它,如果需要就旋转图片。请参考: http://php.net/manual/zh/function.exif-read-data.php - Marc B
3个回答

172

使用ImageMagick的convertauto-orient选项来实现此功能。

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

或者使用mogrify在原地进行操作。

mogrify -auto-orient your-image.jpg

16
如果您想要替换现有文件(原地操作),则可以使用“mogrify”而不是“convert”,这在需要处理整个目录时非常有用。 - zanedp
1
似乎不是所有情况下都有效。我至少有一个案例,GIMP会问我是否要修复旋转,但convert命令只会让图像保持原样(将实际上部分的图片留在了右侧)。 - xarlymg89
如果你使用 libvpsvips autorot your-image.jpg output.jpg查看函数列表:https://libvips.github.io/libvips/API/current/func-list.html#function-list - MXDVL
convertmogrify 可以(并且确实)减小文件大小,从而降低分辨率。 - Dev Null

57

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
这个解决方案可行!我只尝试了一张图片,当然还有8张,但我会告诉你它的效果如何。对我来说,rotateImage是可以使用的,->rotate就会出问题。 - Jack Franzen
3
谢谢,已修复rotateImage的问题。如果你想测试所有方向:有一个很好的github仓库,其中包含每个exif值的图像。 - tarleb
2
谢谢!我用C#编程工作,只需要进行一点转换就可以了。 - Alvin

2

mogrifyconvert在矫正方向时都会进行有损缩放。

使用exiftran进行无损旋转。

exiftran的一个很好的特性是它的原地标志(-i)允许您一次处理整个目录,结合"auto"-a标志,像这样:

exiftran -ai *.jpg

exiftran 在此输入文件上更改了图像尺寸 48x100 -> 50x100:https://mcc.id.au/2020/image-orientation/arrow-with-orientation.jpg - glen
您提供的图像尺寸为100x50,当我运行exiftran -ai arrow-with-orientation.jpg时,它改变了方向,并且尺寸变成了50x100。 - Dev Null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接