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?
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.
Sign up to join this communityI 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
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.
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).