确定最大可能的图像强度

时间:2014-10-07 15:02:52

标签: php imagemagick imagick

开始使用PHP Imagick类和缺少文档。特别是使用paintTransparentImage方法。

在ImageMagick的CLI版本中,可以简单地传递fuzz参数的百分比。但是,在PHP中,您似乎必须将其指定为相对于图像的"maximum possible intensity"的数量。

如何确定图像的最大可能强度呢?显然它可以是255,65535或4294967295。

2 个答案:

答案 0 :(得分:2)

使用PHP,您可以确定量子范围,并使用pow(2,Q)

计算强度
$img = new Imagick('source.png');
$quantum = $img->getQuantumDepth()['quantumDepthLong'];
$target = 'black';
$alpha = 0.0; // Fully transparent
$fuzz = 0.5 * pow(2,$quantum); // From black to gray50
$img->paintTransparentImage($target, $alpha, $fuzz);

根据上述评论,最大强度可以通过量子尺寸

进行映射
+---------------+-------------+---------------+
| Quantum Range | Packet Size | Max Intensity |
+---------------+-------------+---------------+
|  8            |  32 bits    |        255    |
| 16            |  64 bits    |      25535    |
| 32            | 128 bits    | 4294967295    |
+---------------+-------------+---------------+

答案 1 :(得分:0)

基于上面的答案,我将发布我自己的解决方案,以防其他人受益。基本上只是按摩Imagick类,以使其对人类用户更加理智。好消息是,它不违反现有paintTransparentImage函数的语法,因为fuzz参数已经被列为float(虽然它确实改变了语义)。这个调整只是使它类似于你可以传递一个百分比的cli界面(虽然在这里你将通过.1而不是10来表示10%)。

class SaneImagick extends Imagick
{
    public function paintTransparentImage($target, $alpha, $fuzz)
    {
        $iQuantumDepth = pow(2, $this->getQuantumDepth()['quantumDepthLong']);
        return parent::paintTransparentImage($target, $alpha, $fuzz * $iQuantumDepth);
    }
}