image-processing - ImageMagick:检测完全透明的空白图像
问题描述
我正在使用 ImageMagick 6 将我的图像分割成多个部分。 如何用网格分割图像并保留透明度边界框
dim=`convert image.png -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( image.png -crop 10x10% \) -layers composite result.png
一切都很完美,但如果我使用这样的输入图像:
在输出时,我得到了一些完全透明的空图像,因为从输入图像中 - 它的角落没有任何东西。
是的,它应该如何工作,但我正在寻找如何避免这种情况。
或者从磁盘中删除空白图像,因为我不需要它们。
如果没有正常的方法可以做到这一点?
我也在考虑解决方法,比如检测完全空的图像并修改它们(用颜色或任何其他填充,无论如何),所以之后我可以在 Finder 中仅按修改日期对输出文件进行排序并手动删除它们。
ps 我有像那个圆形 2000 x 2000px 大小和 5% 切片的图像,想象一下输出中的空图像数量......手动删除它不仅仅是一种痛苦。
解决方案
您需要在 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)如果阿尔法通道接近黑色,跳过该层
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
推荐阅读
- python - 查找系统的空闲时间
- .htaccess - 有没有办法让 htaccess 在匹配的 URL 上返回空白页?
- python - 包含上的 Google Cloud Datastore Python3 AttributeError
- javascript - 将 sql 查询返回到 txt 文件 - Node JS
- jquery - 使用自定义模板作为评级的 Kendo ui 下拉列表 jquery 无法正确显示所选值 - Telerik kendo ui jquery
- javascript - 如何删除表单的ajax部分
- html - 内容离开屏幕(HTML CSS)
- javascript - 我找不到在 HTML 和 Javascript 中声明的变量
- mongodb - 为嵌套案例类自动创建 mongo 编解码器
- python - 如何连接具有不同 N 行的 Pandas 数据帧?