Начинаем использовать классы PHP Imagick и отсутствие документации. В частности, используя paintTransparentImage метод.
В CLI-версии ImageMagick можно просто передать процент для fuzz
параметр. Тем не менее, в PHP кажется, что вы должны указать его как количество относительно «максимально возможная интенсивность» изображения.
Как определить максимально возможную интенсивность изображения? По-видимому, это может быть 255, 65535 или 4294967295.
С помощью 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 |
+---------------+-------------+---------------+
основываясь на ответе выше, я просто опубликую свое собственное решение на случай, если оно может принести пользу другим. По сути просто массируя Imagick
немного, чтобы сделать его более разумным для человека. Хорошей новостью является то, что он не нарушает синтаксис существующих paintTransparentImage
функция с fuzz
Параметр уже указан как число с плавающей точкой (хотя он и меняет семантику). Этот твик просто напоминает интерфейс 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);
}
}