43

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?

2

3 Answers 3

64

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
7
  • 1
    thx, how do I tell the command that the filename left of -rotate -180 has to be the same as right of it , if there are many files?
    – sharkant
    May 17, 2017 at 11:42
  • Rotating a file 180 degrees will always give you the same result, no matter if you rotate it left or right. May 17, 2017 at 14:17
  • @GAD3R 360 degrees will result in the same image afterwards. Rotating an image left or right by 180 degrees, with both give you the same image (but upside down). May 17, 2017 at 14:21
  • 2
    $CAPITAL_NAMES should be left to environment variables; for those local variables in shell scripts or commands use $normal_lowercase
    – cat
    May 17, 2017 at 16:46
  • 3
    convert re-encodes JPEG and hence is lossy. Better use jpegtran Aug 6, 2017 at 12:44
19

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.

2
  • For counter-clockwise (left-angle) rotation with jpegtran, use -rotate 270 and with exiftran use -2flag according to the manual.
    – Timo
    Mar 12, 2018 at 19:47
  • *.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
1

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).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.