场景
我想将具有alpha透明度的图像保存为.png,将没有alpha透明度的图像保存为.jpg (即使它们的原始格式是.png或.gif)。如何使用ImageMagick检测图像是否具有alpha透明度?
发布于 2010-04-06 06:17:47
ImageMagik命令:
identify -format '%[channels]' foo.png 如果有或没有alpha通道,将分别打印rgba或rgb。
可能会有一个alpha通道,其中没有数据,实际上不会有任何透明度,但这有点复杂。
发布于 2016-01-02 17:54:04
检查图像是否有alpha通道
按照serhiy.h's answer使用-format %A,。从documentation
%启用图像透明度通道(true/false)
检查图像是否没有透明或半透明像素
使用-format %[opaque].从documentation
%不透明计算:图像是否完全不透明?
示例
为了演示,让我们创建一个具有alpha通道但完全不透明的图像a.png,以及一个除了一个半透明像素之外相同的图像b.png:
$ convert rose: PNG32:a.png
$ convert rose: -fill '#0008' -draw "matte 10,10 point" PNG32:b.png不出所料,%A转义会为两个图像生成True,因为这两个图像都有alpha通道:
$ identify -format '%A' a.png
True
$ identify -format '%A' b.png
True而%[opaque]转义在一种情况下生成true,在另一种情况下生成false,这是由于一个透明像素:
$ identify -format '%[opaque]' a.png
true
$ identify -format '%[opaque]' b.png
false发布于 2013-09-20 21:40:44
如果你想检查一张图片实际上是透明的...(不仅仅是可能未使用的alpha通道)
使用以下命令:
convert some_pic.png -verbose info:(是的,在命令的末尾有一个: )
它相当冗长。查找channels列表:
(...)
Channel depth:
red: 16-bit
green: 16-bit
blue: 16-bit
Channel statistics:
(...)在本例中,有三个通道,每个通道对应一个基色。但不适用于alpha。所以这张图片是不透明的。
但是你也可以得到这样的输出:
(...)
Channel depth:
red: 16-bit
green: 16-bit
blue: 16-bit
alpha: 1-bit
Channel statistics:
(...)这里有一个alpha通道。然而,这并不能证明图像是透明的。它只是说它可能是。在该命令的输出中,查找有关alpha通道的信息:
(...)
Alpha:
min: 255 (1)
max: 255 (1)
mean: 255 (1)
standard deviation: 0 (0)
kurtosis: 0
skewness: 0
(...)在本例中,alpha表示图片是不透明的:min = max =1 (1 =不透明,0=透明)。因此,即使图像具有alpha通道,用户也会看到不透明的图片。
您还可以获得以下内容:
(...)
Alpha:
min: 95 (0.372549)
max: 212 (0.831373)
mean: 111.187 (0.436028)
standard deviation: 19.5635 (0.0767196)
kurtosis: 7.52139
skewness: -2.80445
(...)这次,min = 0.372549。这意味着一些像素是部分透明的。mean也很低。似乎图像的很大一部分使用了透明度。
根据你想要实现的检查类型(完全不透明,“几乎不透明”等),如果你的请求有点棘手,你应该检查min,mean,也许还有standard deviation。
注意:您可能会尝试检查min、mean和其他变量的整数值,就像我在第一个地方所做的那样。毕竟,处理95比处理0.372549更容易。如果选择此路线,请注意alpha通道深度。如果是8位,则255是最大值,表示“不透明”。如果它是16位,那么最大值现在是65535,255表示“几乎透明”。最好检查括号中的浮点数,它的范围总是从0到1。
如果你怀疑你要处理的许多图片根本没有alpha通道,那么首先运行可能会很有用:
identify -format '%[channels]' some_pic.png如果它转储:
rgba有一个alpha通道(输出中的a ),convert应该用来检查min等。但是如果没有,就不需要运行convert。尽管我没有对这两个命令进行基准测试,但identify应该比convert快得多。
https://stackoverflow.com/questions/2581469
复制相似问题