ImageMagick: обнаружение полностью прозрачных пустых изображений - PullRequest
0 голосов
/ 10 октября 2018

Я использую ImageMagick 6 для нарезки своих изображений на части. Как разделить изображение с помощью сетки и сохранить прозрачность ограничивающего прямоугольника

dim=`convert image.png -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( image.png -crop 10x10% \) -layers composite result.png

Все работает отлично, но если я использую входное изображение, как это:

enter image description here

На выходе я получаю несколько полностью прозрачных пустых изображений, потому что из входного изображения - по углам ничего нет.

Да, вот как это должно работать, однако я ищу, как этого избежать.

Или удалите эти пустые образы с диска, потому что они мне не нужны.

Если нет нормального способа сделать это?

Я также думаю об обходном пути, например, обнаружение полностью пустых изображений и их изменение (заливка цветом или любое другое, неважно), так что после этого я могу отсортировать выходные файлы в Finder только по дате изменения и удалитьих вручную.

ps У меня есть такие изображения, как размер круга 2000 x 2000px и срез в 5%, представьте количество пустых изображений на выходе ... удалите это вручную, это больше, чем боль.

1 Ответ

0 голосов
/ 11 октября 2018

Вам нужно написать цикл сценария следующим образом в Unix Imagemagick 6. Я поместил ваше входное изображение в каталог с именем test на моем рабочем столе.Я не уверен, почему вы использовали свои команды выше, но это может быть обрезано напрямую без составных слоев.Я сохраняю все обрезанные изображения в слоях временного файла MIFF, который я удаляю в конце.Основная идея состоит в том, чтобы проверить каждое обрезанное изображение, чтобы увидеть, является ли его альфа-канал чистым черным (или почти чистым черным, чтобы избежать крошечных очень прозрачных одиночных пикселей).

1) Если черный цвет находится в пределах небольшого порога, удалите альфа-канал со слоя miff, сохранив его в виде выходного изображения с черным номером.В противном случае просто сохраните слой как пронумерованное выходное изображение.

cd
cd desktop/test
convert image.png -background black -alpha background -crop 10x10% image.miff
num=`convert image.miff -format "%n\n" info: | head -n 1`
for ((i=0; i<num; i++)); do
trans_test=`convert image.miff[$i] -alpha extract -scale 1x1! -format "%[fx:mean<=0.0001?0:1]" info:`
echo "i=$i test=$trans_test"
if [ $trans_test -eq 0 ]; then
convert image.miff[$i] -alpha off result-$i.png
else
convert image.miff[$i] result-$i.png
fi
done
rm -f image.miff
cd


2) Если альфа-канал почти черный, пропустите этот слой

cd
cd desktop/test
convert image.png -background black -alpha background -crop 10x10% image.miff
num=`convert image.miff -format "%n\n" info: | head -n 1`
for ((i=0; i<num; i++)); do
trans_test=`convert image.miff[$i] -alpha extract -scale 1x1! -format "%[fx:mean<=0.0001?0:1]" info:`
echo "i=$i test=$trans_test"
if [ $trans_test -eq 1 ]; then
convert image.miff[$i] result-$i.png
fi
done
rm -f image.miff
cd


3) Если альфа-канал черный, пропустите его, но наберитерезультаты последовательно только для сохраненных.

cd
cd desktop/test
j=0
convert image.png -background black -alpha background -crop 10x10% image.miff
num=`convert image.miff -format "%n\n" info: | head -n 1`
for ((i=0; i<num; i++)); do
trans_test=`convert image.miff[$i] -alpha extract -scale 1x1! -format "%[fx:mean<=0.0001?0:1]" info:`
echo "i=$i test=$trans_test"
if [ $trans_test -eq 1 ]; then
convert image.miff[$i] result-$j.png
j=$((j+1))
fi
done
rm -f image.miff
cd


4) Если альфа-канал черный, пропустите его, но пронумеруйте результаты только для тех, которые находятся с ведущими нулями.

cd
cd desktop/test
j=0
convert image.png -background black -alpha background -crop 10x10% image.miff
num=`convert image.miff -format "%n\n" info: | head -n 1`
for ((i=0; i<num; i++)); do
trans_test=`convert image.miff[$i] -alpha extract -scale 1x1! -format "%[fx:mean<=0.0001?0:1]" info:`
echo "i=$i test=$trans_test"
if [ $trans_test -eq 1 ]; then
jj=`printf "%02d" $j`
convert image.miff[$i] result-$jj.png
j=$((j+1))
fi
done
rm -f image.miff
cd
...