Home > OS >  Unable to pass output or find to image magick
Unable to pass output or find to image magick

Time:08-08

For some images in a directory as follows:

Atlas_21YearNova59_add_main.png
Atlas_21YearNova59_add_mask.png 
Atlas_Activity_2022faith52_add_main.png
Atlas_Activity_2022faith52_add_mask.png
Atlas_ActivityQA02_add_main.png
Atlas_ActivityQA02_add_mask.png

I need to multiply the main image with the mask image as

magick Atlas_ActivityQA002_add_main.png Atlas_ActivityQA002_add_mask.png -compose multiply -composite 002.png

to do this for every image:

for i in `seq -w 1 100`
do 
    find -regextype sed -regex ".*"$i".*" | xargs -I {} magick {} -compose multiply -composite $i".png"
done

However instead of passing the main and mask image together, they are passed one by one. Using -t flag in xargs, the command being executed is

magick ./Atlas_ActivityQA002_add_main.png -compose multiply -composite 002.png 

The output of

for i in `seq -w 1 10`
do 
    find . -regextype sed -regex ".*"$i".*" | xargs
done

is

./Atlas_21YearNova59_add_main.png ./Atlas_21YearNova59_add_mask.png  
./Atlas_ActivityQA02_add_main.png ./Atlas_ActivityQA02_add_mask.png

But the images are passed separtely when called with magick. How to fix this?

CodePudding user response:

can't you just

for x in `seq -w 001 100`
do
 magick Image_${x}_main.png Image_${x}_mask.png -compose multiply -composite ${x}.png
done

CodePudding user response:

Ok, so you shifted the goal posts since the images are no longer a sequence, but still you just have to extract the "root name", which can be done easily in bash:

for f in *_main.png
do
    rootname=${f%%_main.png}
    magick ${rootname}_main.png ${rootname}_mask.png -compose multiply -composite ${rootname}.png
done

If you are using ksh, you can also extract the root name using the basename command:

for f in *_main.png
do
    rootname=$(basename $f _main.png)
    magick ${rootname}_main.png ${rootname}_mask.png -compose multiply -composite ${rootname}.png
done

In bash if you have multiple folders, you can still process all the files in one shot with:

# enable '**' matching
shopt -s globstar  
# All *_main.png in all directories below the current one
for f in **/*_main.png 
do
    # this keeps the directory
    rootname=${f%%_main.png}  
    # All files have a directory specification
    magick ${rootname}_main.png ${rootname}_mask.png -compose multiply -composite ${rootname}.png 
done
  • Related