ImageMagick:检测完全透明的空白图像

时间:2018-10-10 10:06:42

标签: image-processing imagemagick

我正在使用ImageMagick 6将图像切成多个部分。 How to split an image with a grid and preserve transparency bounding box

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中的输出文件进行排序并手动将其删除。

p.s。我有2000 x 2000px大小的图片,并以5%的比例切片,想象输出中有空白图片。

1 个答案:

答案 0 :(得分:1)

您需要在Unix Imagemagick 6中编写一个脚本循环,如下所示。我已将输入图像放在桌面上名为test的目录中。我不确定您为什么使用上面的命令,但是可以直接裁剪而无需复合图层。我将所有裁剪后的图像保存到临时miff文件的层中,最后将其删除。基本思想是测试每个裁剪的图像,以查看其Alpha通道是否为纯黑色(或为避免微小的非常透明的单个像素而接近纯黑色)。

1)如果在某个较小的阈值内为黑色,则从miff层中删除alpha通道,将其保存为黑色编号的输出图像。否则,只需将图层另存为编号的输出图像。

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)如果Alpha通道接近黑色,则跳过该层

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)如果Alpha通道为黑色,请跳过该通道,但仅对保留的通道顺序编号。

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)如果alpha通道为黑色,请跳过该通道,但仅对保留前导零的通道进行顺序编号。

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