开始使用PHP Imagick类和缺少文档。特别是使用paintTransparentImage方法。
在ImageMagick的CLI版本中,可以简单地传递fuzz
参数的百分比。但是,在PHP中,您似乎必须将其指定为相对于图像的"maximum possible intensity"的数量。
如何确定图像的最大可能强度呢?显然它可以是255,65535或4294967295。
答案 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);
}
}