2016-02-10 79 views
1

我想计算特定图像中具有透明度的像素的百分比。为此,我试图检测像素是否具有透明度(在PHP上使用Imagick)。我知道,基本上有'getPixel'和'getColor'返回一个rgba数组,但我得到了'a'为jpg和非透明PNG图像的各种值...以及没有规范化的尝试。用Imagick检测像素透明度

例如,对于此图像,我获得了各种像素enter image description here的alpha值0,1,0.1,0.9等。

这是我使用的代码:

$imageIterator = $image->getPixelIterator();  
foreach ($imageIterator as $row => $pixels) { 
    foreach ($pixels as $column => $pixel) { 
     $color = $pixel->getColor(true); 
     echo $color['a'] . PHP_EOL; 
     ... 

我在做什么错?是否有另一种获取此信息的方式?

+1

分享您的代码:) –

+1

谢谢 - 我添加了它。 – yakobom

+0

该图像不透明。 – Danack

回答

2

您可以检查您的版本:

php -i | grep -i -A10 magick 

我的是这样的:

imagick module => enabled 
imagick module version => 3.3.0 
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator, ImagickKernel 
Imagick compiled with ImageMagick version => ImageMagick 6.9.3-0 Q16 x86_64 2016-01-08 http://www.imagemagick.org 
Imagick using ImageMagick library version => ImageMagick 6.9.3-0 Q16 x86_64 2016-01-08 http://www.imagemagick.org 
ImageMagick copyright => Copyright (C) 1999-2016 ImageMagick Studio LLC 
ImageMagick release date => 2016-01-08 

运行这段代码,我得到了你的形象所有的人 - 即没有阿尔法层或完全不透明的图像:

#!/usr/local/bin/php -f 
<?php 
$image = new Imagick("budgie.png"); 
$pixel_iterator = $image->getPixelIterator(); 
foreach($pixel_iterator as $y => $pixels) 
{ 
    foreach($pixels as $x => $pixel) 
    { 
     $color = $pixel->getColor(true); 
     echo $color['a'] . PHP_EOL; 
    } 
} 
?> 

同样地,如果我跑你的形象identify,它没有显示出阿尔法层p再发:

identify -verbose budgie.png | more 
Image: budgie.png 
    Format: PNG (Portable Network Graphics) 
    Mime type: image/png 
    Class: DirectClass 
    Geometry: 296x383+0+0 
    Units: Undefined 
    Type: TrueColor 
    Endianess: Undefined 
    Colorspace: sRGB 
    Depth: 8-bit 
    Channel depth: 
    red: 8-bit 
    green: 8-bit 
    blue: 8-bit 

我觉得你的版本/配置有些问题。

+0

谢谢。我的确是老,3.1.2。你知道我怎么能更新到最新?使用“sudo apt-get install php5-imagick”告诉我我有最新版本 – yakobom

+0

恐怕我使用OSX和'homebrew'进行包管理。我认为你可能需要执行'sudo apt-get update'来更新你的软件包列表,但请先谷歌一些并首先检查 - 也许确保你的备份是最新的,然后再做太多。 –

+0

不,我已经这样做了......我会尽力找到办法。如果这确实解决了我的问题,我自然会接受你的答案。非常感谢你。 – yakobom