使用ImageMagick,是否可以轻松确定图像是否具有透明度以外的任何实际内容?
后面的故事是我正在裁剪一个内容未知的图像,但是一个已知的区域地图(想想游戏皮肤)。我为其中一部分裁剪的区域要么包含某些东西,要么它不会被取消。如果它包含某些内容,我需要对它做些什么。如果它没有,我需要废弃它并继续前进。谢谢!
答案 0 :(得分:1)
我有一些你可以尝试的想法,但我没有看到你的图像,所以你需要测试它们。
首先,您可以计算图像中的颜色数量,如下所示:
identify -format "%[k]" input.png
如果只有透明度,颜色数将为1,如果图像中有其他颜色,则大于1。然而,这不能区分纯单色图像和纯透明图像。这可能是也可能不是问题。我不会说Ruby,但我相信你在Ruby中这样访问k
:
image["%[k]"]
其次,您可以计算图像的平均像素颜色,如下所示:
identify -format "%[mean]" input.png
在完全透明的图像中,这将为零。然而,对于全黑图像,它也将为零,这可能是也可能不是问题。
使用
也可以看到这两个参数identify -verbose input.png
如果你想要一个更强大的测试,例如区分完全透明图像和全黑图像,你可以使用上面的测试之一,并将其与获取左上角的单个像素的值相结合。图像排除上面的奇数边缘情况,如下所示:
convert black.png -format "%[pixel:p{0,0}]" info:
black
convert transparent.png -format "%[pixel:p{0,0}]" info:
none
另一种选择是计算直方图,如下所示,并查看颜色:
convert input.png -format %c histogram:info:-
答案 1 :(得分:0)
我最终使用了以下代码:
def transparent? image
solid_color = image['%[mean]'].to_i == 0 # transparent or solid color
not_opaque = !image['%[opaque]'].to_bool # no transparency remaining
solid_color && not_opaque
end
正如Mark Setchell所提到的那样, image['%[mean]']
给我0作为单色或完全透明。这让我走了一半。为了确定单色是否透明,我使用了image['%[opaque]']
。如果这是“真实的”,那么它就是一种颜色。否则,透明。 .to_bool
方法只接受生成的布尔字符串并将其转换为实际的布尔值。
我希望这有助于其他人!再次感谢Mark的重要开始,Mark!