I got a request today to extract the compass bearing from a set of photos, and add a rotated north arrow to those images in visual form so end users can see if the picture was while the camera was pointed north, or east, or NNW, etc.. Below is a photo pointing mostly East.

With BASH and a little Imagemagick, this was a pretty easy build. First we extract the direction info, and transform it to Cartesian coordinates so our rotation numbers will be correct. Then we rotate our arrow, maintaining transparency of background. Finally we use the “composite” command to overlay our rotated arrow with the original image.
Voila!
(code edited to remove transformation to cartesian — rotation in imagemagick is polar…)
#!/bin/bash
for image in `ls *.JPG`
do
# trim off leading and trailing spaces in image variable
image=`echo $image | xargs`
# get non-extension portion of name
name=`echo $image | awk -F'.' '{print $1}'`
# extract angle from EXIF, and turn into variable
angle=`exif $image | grep 'Image Direction' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sed 's/M//g' | xargs`
# create rotated and scaled arrow for image
convert -rotate $angle -transparent white -resize 300x300 arrow-hi.png arrow-hi_$angle.png
# overlay that arrow on original image
composite arrow-hi_$angle.png $image $name.png
# perform a wee bit of cleanup
rm arrow-hi_$angle.png
done
addendum — almost forgot the repo: