nvvetal
nvvetal

Reputation: 1793

Imagemagick convert and compose batch of files

I am trying to make a fast convert of a batch of files like this:

convert ./src/*.png -set filename: '%t' -gravity West -draw 'image over 0,0 424,600 "./panel.png"' ./dest/%[filename:].png

which is pretty similar to COMPOSITE:

convert ./src/*.png ./panel.png -set filename: '%t' -gravity +0+0 -composite ./dest/%[filename:].png

except the last one is not working and just making one first crappy-looking file. Looks like it's bug?

Does anybody know how to make it more correct with -composite? for|awk|ls|find for each file in shell is not acceptable - because that is slower than the first example.

Upvotes: 2

Views: 3767

Answers (3)

GeeMack
GeeMack

Reputation: 5395

  • Read in the list of files,
  • set their output filenames,
  • include the IM special image placeholder "null:",
  • read in your overlay image,
  • optionally, set the geometry,
  • and composite that overlay onto all the other images with "-layers composite".

That null: separates the original input file list from the overlay image so ImageMagick knows where in the stack you want to start doing the composite.

Try something like this (one step per line for readability):

convert ./src/*.png \
    -set filename: '%t' \
    null: \
    ./panel.png \
    -layers composite ./dest/%[filename:].png

Upvotes: 4

fmw42
fmw42

Reputation: 53182

You could use Imagemagick mogrify command. See http://www.imagemagick.org/Usage/basics/#mogrify and http://www.imagemagick.org/Usage/basics/#mogrify_compose

cd to input directory
mogrify -format png -path ./dest -gravity West -draw 'image over 0,0 424,600 "./panel.png"' *.png

Upvotes: 2

emcconville
emcconville

Reputation: 24439

Looks like it's bug?

Not a bug. Your second command is telling ImageMagick to consume all files matched into an image stack, and composite it as one.

You can attempt the same solution with the mogrify utility, but I believe it would be way simpler if you expand the bash script with a single for loop.

for f in $(ls src/*.png)
do
   dest=$(basename $f);
   convert "$f" ./panel.png -gravity West -composite "./dest/$dest"
done

Upvotes: 2

Related Questions