2016-10-07 49 views
0

我试图检查图像是否实际上是透明的,而不仅仅是检查Alpha通道。检测图像在GraphicsMagick中是否透明

为了演示,让创建具有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]

$ identify -format '%[opaque]' a.png 
true 
$ identify -format '%[opaque]' b.png 
false 

什么是相同的graphicsmagick,%A只检查是否透明度是支持不是图像实际上是透明的。

+0

我的回答是否解决了您的问题?如果是这样,请考虑接受它作为您的答案 - 通过点击投票计数旁边的空心绿色勾号/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

回答

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:"的行,后跟其他任何数字比零。所以,你会得到一个0或1(-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 

和diff的他们,你会看到这样的差异:

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:"和然后检查第二列是否超过零。

希望有帮助!