Page 1 of 1
Loop inside of a loop Batch removing bg
Posted: 2019-04-07T19:23:34-07:00
by naive
Hey Guys, im have two batches of files:
1. Files with background (jpg)
2. Masks for those files (tif)
I'm trying to write a batch script to iterate over those files and remove the backgrounds for each of them, here is my code:
Code: Select all
for (( i = 10; i <= 19; i++ )) ### Outer for loop ###
do
for (( j = 10 ; j <= 19; j++ )) ### Inner for loop ###
do
Convert ${i}.jpg image_a_00${j}.tif -alpha off -compose CopyOpacity -composite %03d.png
done
echo "" #### print the new line ###
done
It seems to be really slow, is there a better way to do it?
Thanks in advance
Running on MAC Imagemagick 7
EDIT:
Just checked the output and actually it doesnt work, the mask files don't get itterated for some reason..
Re: Loop inside of a loop Batch removing bg
Posted: 2019-04-07T20:51:54-07:00
by fmw42
Post some example images and masks so we can examine them. Also what is your exact IM 7.x.x.x version. Note that IM 7 uses magick, not convert and not magick convert. I do not know of any easier way unless the mask is the same for all images. Then you can use magick mogrify.
You cannot combine one alpha channel with another in the way you are trying. It looks like you are masking with multiply mask images when you loop over j. If so, then composite multiply all masks together and use just that one in a single loop over i for each of your input images.
Re: Loop inside of a loop Batch removing bg
Posted: 2019-04-08T02:18:29-07:00
by snibgo
naive wrote:it doesnt work
The output filename is "%03d.png". If there were many outputs within the convert, the number would auto-increment. But as there is only one output per convert, with many converts, they will all have the same name.
I suggest you make the name something like "myfile_${i}_${j}.png".
Re: Loop inside of a loop Batch removing bg
Posted: 2019-04-08T03:45:45-07:00
by naive
fmw42 wrote: ↑2019-04-07T20:51:54-07:00
Post some example images and masks so we can examine them. Also what is your exact IM 7.x.x.x version. Note that IM 7 uses magick, not convert and not magick convert. I do not know of any easier way unless the mask is the same for all images. Then you can use magick mogrify.
You cannot combine one alpha channel with another in the way you are trying. It looks like you are masking with multiply mask images when you loop over j. If so, then composite multiply all masks together and use just that one in a single loop over i for each of your input images.
IM:
ImageMagick 7.0.8-26 Q16 x86_64 2019-02-09
Ah interesting i was always using using convert for the past 2 years.....haha
I'm actually just trying to apply one mask per one image
Images:
Masks:
snibgo wrote: ↑2019-04-08T02:18:29-07:00
naive wrote:it doesnt work
The output filename is "%03d.png". If there were many outputs within the convert, the number would auto-increment. But as there is only one output per convert, with many converts, they will all have the same name.
I suggest you make the name something like "myfile_${i}_${j}.png".
ah yeah actually my latest code in the loop was this,which was iterating correctly over the images but not over the masks
Code: Select all
convert ${i}.jpg image_a_00${j}.tif -alpha off -compose CopyOpacity -composite ${i}j.png
Re: Loop inside of a loop Batch removing bg
Posted: 2019-04-08T04:42:31-07:00
by snibgo
naive wrote:I'm actually just trying to apply one mask per one image
But you are applying all the masks to all the input images, a loop within a loop.
Re: Loop inside of a loop Batch removing bg
Posted: 2019-04-08T06:04:13-07:00
by naive
oops, so i guess i can just solve it with one loop
Code: Select all
for (( i = 1; i <= 77; i++ ))
do
magick ${i}.jpg image_a_00${i}.tif -alpha off -compose CopyOpacity -composite ${i}small.png
done