如何从命令行旋转一组图片?

如何从命令行旋转一组图片?

我有一大堆具有相同分辨率的 JPEG 图片。在 imagemagic 或 gimp 的图形界面中打开每一个都需要很长时间。

如何实现每张图片旋转并保存为相同的文件名?

答案1

您可以使用convert命令:

转换 input.jpg -旋转<角度(以度为单位)>输出.jpg

顺时针旋转 90 度:

convert input.jpg -rotate 90 out.jpg

要以相同的名称保存文件:

convert file.jpg -rotate 90 file.jpg

要旋转所有文件:

for photo in *.jpg ; do convert $photo -rotate 90 $photo ; done

或者,您也可以使用mogrify推荐的命令行工具(最好的工具)@don-crissti

mogrify -rotate 90 *.jpg

答案2

对于 JPEG 图像和直角旋转,请使用jpegtran或者exiftran,因为它们可以无损地旋转图像。

for f in *.jpg ; do 
    jpegtran -rotate 180 "$f" > "${f%.jpg}-rotated.jpg"
done

或者就地旋转:

for f in *.jpg ; do
    jpegtran -rotate 180 -outfile "$f" "$f"
done

exiftran还有一个-a标志可以根据 EXIF 方向标签的内容自动旋转图像。

答案3

请注意,其他两个答案可能会根据 EXIF 方向提供不同的结果:似乎convert相对于 EXIF 方向旋转,而jpegtran只是忽略 EXIF 方向。

这一观察使我发现我实际上需要丢弃 EXIF 方向,因此我只是用来exiftool丢弃 EXIF 数据而不会进一步丢失数据(这似乎也是jpegtran在没有给出选项时所做的事情):-rotate

exiftool -all= -o outfile.jpg infile.jpg

我可以直接删除 EXIF 方向

exiftool -Orientation= -o outfile.jpg infile.jpg

或修改它

exiftool -n -Orientation=1 -o outfile.jpg infile.jpg

(对于后面的情况,您需要阅读常见问题解答了解转换值-n所需的option ,以及exiftool-OrientationEXIF 标签表)。

答案4

这是一个较旧的问题,但是我在寻找此任务的解决方案时发现了它。

问题是jpegtran它确实旋转了图像,但它丢弃了所有 EXIF 标头数据。

exiftool保留了,但是用起来不太方便。

因此,我编写了一个小脚本来将 JPEG 图像旋转 90°,同时保留 EXIF 标头。也许有人会发现这很有用:

#!/bin/bash

orientation=$(exiftool -n -Orientation "$1")

if [[ "$?" != "0" ]]; then
    exit 1
fi

orientation=${orientation##*: }

if [[ "$orientation" == "1" ]]; then
    # 1 = Horizontal (normal)
    target="6"
elif [[ "$orientation" == "6" ]]; then
    # 6 = Rotate 90 CW
    target="3"
elif [[ "$orientation" == "3" ]]; then
    # 3 = Rotate 180
    target="8"
elif [[ "$orientation" == "8" ]]; then
    # 8 = Rotate 270 CW
    target="1"
else
    echo "Can't process orientation \"$orientation\""
    exit 1
fi

extension=${1/*./}
backup="${1%$extension*}orig.$extension"

mv "$1" "$backup" || exit 1

exiftool -n -Orientation=$target "$backup" -o "$1"

相关内容