Overlaying an image's filename using ImageMagick (or similar)

It's a very old entry but I find it each time I search for this topic, and it doesn't work (for me at least). Here something that works for me:

convert input.jpg -gravity South -annotate 0 '%f' output.jpg

Hope this helps someone...


Eric L.'s answer is correct -- +1 from me for it! -- but -annotate doesn't give you much control over the appearance of the text.

If you look for prettyness, then rather go for something that uses -composite. You can use an IM command to construct an overlay image first (which uses a semi-transparent background) and then overlay it over the original image.

Here is an example how to do it with -composite instead of -annotate, using a scripted approach that processes every PNG file in the current directory. This one even automatically adapts the font size and fits it into the available "width * 90%" -- it is a Bash script (see comments for Win equivalent):

for img in *.png; do

   width=$(identify -format %W ${img})
   width=$(( ${width} * 9 / 10 ))

   convert                  \
     -background '#0008'    \
     -gravity center        \
     -fill white            \
     -size ${width}x100     \
      caption:"${img}"      \
      "${img}"              \
     +swap                  \
     -gravity south         \
     -composite             \
      "with-caption-${img}"

done

An example illustration for one original and the respective output are below:

original image image with caption!

Here is a command that uses -annotate, trying to set a few things beyond the default parameters:

for img in so#12231624-right.png; do

   convert                   \
      "${img}"               \
     -fill red               \
     -undercolor '#0008'     \
     -pointsize 24           \
     -gravity south          \
     -annotate +0+5 "${img}" \
      "with-annotate-${img}"

done

original image resulting image


You can also use mogrify to add text to bunch of images at once.

mogrify -gravity South -annotate 0 '%f' -pointsize 24 -fill white  *.png

This will overwrite existing images, so make sure you have a backup before you execute this.