我有一大堆具有相同分辨率的 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
答案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
-Orientation
EXIF 标签表)。
答案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"