使用ImageMagick确定图像内容

使用ImageMagick确定图像内容,imagemagick,transparency,minimagick,Imagemagick,Transparency,Minimagick,是否可以使用ImageMagick轻松确定图像是否具有除透明度之外的任何实际内容 背后的故事是,我正在裁剪一个内容未知的图像,但有一个已知的区域地图(想想游戏皮肤)。我裁剪的部分区域要么包含某些内容,要么不包含。如果它包含一些东西,我需要用它做点什么。如果不行,我就得放弃它,继续前进。谢谢 我有几个想法你可以试试,但是我没有看到你的图片,所以你需要测试一下 首先,您可以计算图像中的颜色数,如下所示: identify -format "%[k]" input.png identify -for

是否可以使用ImageMagick轻松确定图像是否具有除透明度之外的任何实际内容


背后的故事是,我正在裁剪一个内容未知的图像,但有一个已知的区域地图(想想游戏皮肤)。我裁剪的部分区域要么包含某些内容,要么不包含。如果它包含一些东西,我需要用它做点什么。如果不行,我就得放弃它,继续前进。谢谢

我有几个想法你可以试试,但是我没有看到你的图片,所以你需要测试一下

首先,您可以计算图像中的颜色数,如下所示:

identify -format "%[k]" input.png
identify -format "%[mean]" input.png
convert black.png -format "%[pixel:p{0,0}]" info:
black

convert transparent.png -format "%[pixel:p{0,0}]" info:
none
如果只有透明度,则颜色数将为1,如果图像中有其他颜色,则颜色数将大于1。但这无法区分纯单色图像和纯透明图像。这可能是个问题,也可能不是。我不会说Ruby,但我相信您可以在Ruby中访问
k

image["%[k]"]
其次,您可以计算图像的平均像素颜色,如下所示:

identify -format "%[k]" input.png
identify -format "%[mean]" input.png
convert black.png -format "%[pixel:p{0,0}]" info:
black

convert transparent.png -format "%[pixel:p{0,0}]" info:
none
如果是完全透明的图像,则为零。但是,对于全黑图像,它也将为零,这可能是问题,也可能不是问题

这两个参数也可以使用

identify -verbose input.png
如果您想要一个更稳健的测试,例如区分完全trasnparent图像和完全黑色图像,您可以使用上面的测试之一,并将其与获取图像左上角单个像素的值相结合,以排除上面的奇数边缘情况,如下所示:

identify -format "%[k]" input.png
identify -format "%[mean]" 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:-

我最终使用了以下代码:

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
image['%[mean]]
给我0表示单色或完全透明,正如马克·塞切尔提到的那样。这让我半途而废。为了确定单色是否透明,我使用了
image['%[不透明]']
。如果这是“真的”,那么它就是一种颜色。否则,就必须透明。
.to_bool
方法只需获取生成的布尔字符串并将其转换为实际的布尔值


我希望这对其他人有帮助!马克,再次感谢你为解决这个问题所做的重要努力

“100%以上的透明度”是什么意思?有些东西怎么可能是100%以上透明的呢?哈,我想这是拙劣的措辞吧。原谅我指的是任何内容,而不是完全透明的内容。顺便说一句,这个名字很棒,@networkedspline。虽然我最终在这里寻找一个单步解决方案,但使用ImageMagick可能不存在。为此,这是实现我所寻找的目标的一种方法,所以我接受这一点作为这个问题的答案。我真的很感谢你的帮助。如果其他人有其他更直接的方法,请告诉我。