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
$CAPITAL_NAMES
should be left to environment variables; for those local variables in shell scripts or commands use $normal_lowercase
convert
re-encodes JPEG and hence is lossy. Better use jpegtran
Commented
Aug 6, 2017 at 12:44
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.
jpegtran
, use -rotate 270
and with exiftran use -2
flag according to the manual.
*.jpg
works under bash but under zshell it causes the error jpegtran: can't open *.jpg for reading
but *jpg
works for me in zshell.
Commented
Dec 28, 2020 at 10:09
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"
jpegtran
has -copy all
to copy exif and other metadata. Note that it doesn't rotate the thumbnail if any.
Commented
May 25, 2023 at 19:55