在GraphicsMagick中检测图像是否透明

时间:2016-10-07 04:00:57

标签: image png alpha graphicsmagick

我正在尝试检查图像是否实际透明,而不仅仅是检查Alpha通道。

为了演示,让我们创建一个具有Alpha通道但完全不透明的图像a.png,以及除一个半透明像素外的图像b.png

gm convert rose: PNG32:a.png

gm convert rose: -fill '#0008' -draw "matte 10,10 point" PNG32:b.png

使用ImageMagick,我们可以使用%[opaque]

轻松检查trasparency
$ identify -format '%[opaque]' a.png
true
$ identify -format '%[opaque]' b.png
false

graphicsmagick的等价物是什么,%A仅检查透明度是否支持,而不是图像实际上是透明的。

1 个答案:

答案 0 :(得分:1)

更新了答案

一种稍微简单的方法已经浮现在脑海中。阅读下面的原始答案,了解我在做什么。

您可以使用gm提取字母/不透明度频道,然后您不必担心-verbose信息输出中的多个频道:

gm convert b.png -channel opacity -verbose info:-

示例输出

gm convert a.png -channel opacity -verbose info:- 
a.png PNG 70x46+0+0 DirectClass 8-bit 7.6Ki 0.000u 0m:0.000000s
Image: a.png
  Format: PNG (Portable Network Graphics)
  Geometry: 70x46
  Class: DirectClass
  Type: grayscale
  Depth: 1 bits-per-pixel component
  Channel Depths:
    Gray:     1 bits
  Channel Statistics:
    Gray:
      Minimum:                     0.00 (0.0000)
      Maximum:                     0.00 (0.0000)
      Mean:                        0.00 (0.0000)
      Standard Deviation:          0.00 (0.0000)
  Filesize: 0
  Interlace: No
  Orientation: Unknown
  Background Color: white
  Border Color: £DFDFDF
  Matte Color: £BDBDBD
  Page geometry: 70x46+0+0
  Compose: Over
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Png:IHDR.color-type-orig: 6
  Png:IHDR.bit-depth-orig: 8
  Signature: d7e8478261a01c7f4c4f6bbb172976d1bd585c1b43195cdb65bafb008f71b5c6
  Tainted: True
a.png INFO 70x46+0+0 DirectClass 8-bit 0.000u 0m:0.010000s

现在,您只需查找(grep)并计算(-c)包含单词"Maximum:"后面跟零以外的任何数字的行。因此,您将获得零或一(-m1)作为输出:

gm convert b.png -channel opacity -verbose info:- 2>&1 | grep -c -m1 "Maximum:.*[1-9]"

原始答案

嗯, GraphicsMagick 在很多方面比 ImageMagick 稍微不够发达!

想到了一些想法。如果您运行:

gm identify -verbose a.png > a.txt
gm identify -verbose b.png > b.txt

并区分它们,你会看到这样的差异:

enter image description here

因此,您可以查找"Type: true color with transparency",或者查看Channel Statistics->Opacity->Maximum并检查它是否大于零。这有点难以搜索,因为单词Opacity:出现两次,但您可以使用awk这样做:

gm identify -verbose a.png | awk '/Channel Statistics:/{f=1} (f==1)&&/Opacity:/{f=2} (f==2)&&/Maximum:/&&($2>0.00){print "Non-opaque pixel found"}'

所以,我基本上检查我看过"Channel Statistics:",然后是"Opacity:",然后查找"Maximum:",然后检查第二列是否超过零。

希望有所帮助!