2011-07-19 54 views
9

我希望能够使用Imagick PHP扩展检测图像是否透明。PHP imagick检测透明度

到目前为止,我唯一的幸运就是运行exec()/一些其他命令,并使用ImageMagick命令行工具来实现此目的。这就是我的意思:

exec("identify -verbose example_transparent_image.png | grep \"Alpha\"", $output); 
$is_transparent = !empty($output) ? true : false; 

逻辑很简单。对有问题的图像进行详细检查:如果输出包含任何alpha信息,则表示它使用透明度。

似乎PHP的imagick扩展应该把它作为它的命令之一,但缺乏文档正在杀死我。每次都必须运行这种检查似乎很愚蠢。

回答

9

唉唉,解决了(我认为)。 Imagick有一个函数getImageAlphaChannel(),如果它包含任何alpha信息则返回true,否则返回false。

确保你有ImageMagick 6.4.0或更新版本。

http://www.php.net/manual/en/function.imagick-getimagealphachannel.php

+1

我自己碰到这个确切的问题,我跑过了辨识图像和getimagealphachannel。 Identifyimage根本没有提供足够的信息,而getimagealphachannel工作得很好。理论上,getImageAlphaChannel()提供了一个ALPHACHEANNEL常量,但坦率地说,文档在这方面是垃圾。我得到一个'0'为一个JPG,'1'为一个PNG与阿尔法,'0'为一个32位无阿尔法。基本上,完美的预期结果。 所以,即使这是目前一个10个月的问题/答案,我认为这是值得加我2美分。 –

0

这是怎么回事?

substr((new Imagick($FILE))->identifyImage()['type'], 0, -5) == 'Alpha' 

看看documentation of identifyImage。您会注意到功能输出的缺失文档。这只是一个解析的

identify -verbose $FILE (from the imagick package) 

其中type识别图像的类型(对比source)版本。 您可以看到,imagick返回了一些MagickTypeOptions数组的值,该数组定义为here。如果调色板包含alpha,则此阵列包含每种图像类型的-Alpha-Matte版本。

理论上你可以用这样的调色板保存图像而不使用它,但是在这种情况下,每个像样的程序都应该切换到非alpha版本。但假阳性是可能的,但应该是罕见的。

此外,我不因为在阵列检查该-Matte图像类型以这样的方式定义的,对于每一个图像类型常数有两个条目具有不同名称(-alpha-Matte ),但如-Alpha先来这个名称将返回该图像类型。

+0

您能否添加一些解释,例如请链接到文档? –