Page 1 of 1

Putting serval pictures in a pipe and merge them with a background

Posted: 2017-09-06T14:36:57-07:00
by outof
Dear ImageMagick community,
I started semi-automated command line editing for a small project a couple of weeks ago and got stuck during usage of pipes / virtual files.

The goal is to pick some jpg-Files from a directory, rotate and move them next to each other and merge them with the background. By using tmp png Files to enable transparency and sticking them together to a backgropund everything works fine:
Transform and rotate:

Code: Select all

convert 1.jpg -resize 50% -background none -rotate 1.png
Glue together:

Code: Select all

convert background.jpg -page +5+10 1.png -page +2100+10 2.png -background none -layers flatten output.jpg
For better IO-perfomance I want to skip the png part by using a pipe (and Miff-files):

Code: Select all

convert -page +5+10 -resize 40% -background none -rotate -4 1.jpg MIFF:-; \
-page +2150+10 -resize 40% -background none -rotate -4 2.jpg MIFF:- \
| convert background.jpg -background none MIFF:- -layers flatten +page +output.jpg
Unfortunately this only works for one input File 1.jpg. As soon as I add 2.jpg things stop to work as expected. After reading and trying a dozen examples including diffrent delimiters between the commands of 1.jpg and 2.jpg like ;| or using composite or montage to stick the pictures to the background I still have no solution. I even tried using brackets during conversion of the jpegs and diffrent alignments of the image manipulations.

Can you please help me to finish my performance optimization. Probably I'm not familiar with piping or using correct syntax for stdin and stdout but I couldn't find any working example.
Thank you

Re: Putting serval pictures in a pipe and merge them with a background

Posted: 2017-09-06T14:54:57-07:00
by fmw42
Your syntax is not correct. You must read the input images before resizing and rotating. Also -page must come before reading the input. But it is easier to use -set page after processing the input images. Also MIFF will hold multiple layers, so you only need one MIFF:-. Use parenthesis processing to do each image (layer).

Try:

Code: Select all

convert \( 1.jpg -resize 40% -background none -rotate -4 -set page +5+10 \)  \
\( 2.jpg -resize 40% -background none -rotate -4 -set page +2150+10 \) MIFF:- \
| convert background.jpg -background none - -layers flatten output.jpg
In the future please always provide your IM version and platform, since syntax may differ.

Re: Putting serval pictures in a pipe and merge them with a background

Posted: 2017-09-06T14:59:17-07:00
by fmw42
You can also do the same with -compose ... -composite using -geometry in pairs of images.

Code: Select all

convert background.jpg 
\( 1.jpg -resize 40% -background none -rotate -4 \) -geometry +5+10 -compose over -composite \
\( 2.jpg -resize 40% -background none -rotate -4 \) -geometry +2150+10 -compose over -composite \
output.jpg
see
http://www.imagemagick.org/Usage/layers/#convert
http://www.imagemagick.org/Usage/basics/#parenthesis

Re: Putting serval pictures in a pipe and merge them with a background

Posted: 2017-09-18T11:38:24-07:00
by outof
Dear Fred,

thank you so much for your quick reply. It rather took me some time to test it and it works as expected :D
During my try n error runs using paraenthesis I missed the white spaces.
To complete my question, I'm using ImageMagick 6.8.9-9 on a Respian Jessie, so your syntax is correct.

Best regards