I have a large set of JPEG pictures all with the same resolution. It would take too long to open each one inside the graphical interface of imagemagic or gimp.
How do I achieve each picture being rotated and saved as the same filename?
I have a large set of JPEG pictures all with the same resolution. It would take too long to open each one inside the graphical interface of imagemagic or gimp.
How do I achieve each picture being rotated and saved as the same filename?
You can use the convert command:
convert input.jpg -rotate <angle in degrees> out.jpg
To rotate 90 degrees clockwise:
convert input.jpg -rotate 90 out.jpg
To save the file with the same name:
convert file.jpg -rotate 90 file.jpg
To rotate all files:
for photo in *.jpg ; do convert $photo -rotate 90 $photo ; done
Alternatively, you can also use the mogrify command line tools (the best tool) recommended by @don-crissti:
mogrify -rotate 90 *.jpg
For JPEG images and right-angle rotations, use jpegtran or exiftran, as they can rotate the images losslessly.
for f in *.jpg ; do
jpegtran -rotate 180 "$f" > "${f%.jpg}-rotated.jpg"
done
Or to rotate in-place:
for f in *.jpg ; do
jpegtran -rotate 180 -outfile "$f" "$f"
done
exiftran also has the -a flag to automatically rotate the image based on what the EXIF orientation tag says.
Note that the two other answers may provide different results depending on the EXIF Orientation : it seems that convert rotates with regards to the EXIF Orientation, while jpegtran just ignores the EXIF Orientation.
This observation led me to figure I actually needed to discard the EXIF Orientation, so I just used exiftool to discard EXIF data without further data loss (that's also what does jpegtran when no -rotate option is given, it seems) :
exiftool -all= -o outfile.jpg infile.jpg
I could have just removed the EXIF Orientation with
exiftool -Orientation= -o outfile.jpg infile.jpg
or modified it with
exiftool -n -Orientation=1 -o outfile.jpg infile.jpg
(for this later case you will need to read the FAQ to understand option -n, needed for exiftool to translate the -Orientation value, and the EXIF tags table).
This is an older question, however I found it whilst searching for a solution for this very task.
The problem with jpegtran is that it does rotate the image, but it discards all the EXIF header data.
exiftool keeps it, but it's not very handy to use.
Thus, I wrote a small script to rotate a JPEG image by 90°, keeping the EXIF header. Maybe someone may find this useful:
#!/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"