PHP Conference Japan 2024

Imagick::paintTransparentImage

(PECL imagick 2, PECL imagick 3)

Imagick::paintTransparentImage更改与填充定义的颜色匹配的任何像素

警告

此函数自 Imagick 3.4.4 起已弃用。强烈建议不要依赖此函数。

描述

public Imagick::paintTransparentImage(混合 $target, 浮点型 $alpha, 浮点型 $fuzz): 布尔型

更改与填充定义的颜色匹配的任何像素。

参数

target

将此目标颜色更改为图像中指定的透明度值。

alpha

透明度级别:1.0 为完全不透明,0.0 为完全透明。

fuzz

图像的 fuzz 成员定义了将两种颜色视为相同可以接受的容差。

返回值

成功时返回true

错误/异常

发生错误时抛出 ImagickException。

变更日志

版本 描述
PECL imagick 2.1.0 现在允许字符串表示颜色作为第一个参数。以前的版本仅允许 ImagickPixel 对象。

添加注释

用户贡献的注释 3 个注释

匿名
15 年前
实际上,它似乎可以工作,但可能不是预期的那样。

查看 ImageMagick 网站上的 fuzz 选项 (https://imagemagick.org.cn/script/command-line-options.php#fuzz),“距离可以是绝对强度单位,也可以通过附加 % 作为最大可能强度的百分比(255、65535 或 4294967295)。”

由于它需要浮点数,因此百分比值将不起作用,因此它实际上是最大强度值之一。在我的情况下,我正在处理的图像似乎具有 65535 的最大强度值。因此,大约 10% 的模糊值为 6500 似乎可以解决问题。

不过,可能存在问题的部分是如何确定颜色/图像的最大强度?使用静态 6500 很好,直到我必须转换最大强度值不为 65535 的图像。如果它是 255,它将擦除整个图像。或者使用更大的值大大缩短模糊。
quickshiftin at gmail dot com
10 年前
在 Stackoverflow 上查看此线程以获取有关如何确定图像最大强度的答案。

http://stackoverflow.com/questions/26239130/determine-max-possible-intensity-of-image/26240656#26240656

简而言之,以下代码使 $fuzz 参数的行为更符合您的预期(它现在表示 0-100 之间的百分比)。$fuzz 值现在应为 0 到 1 之间的浮点数。

class SaneImagick extends Imagick
{
public function paintTransparentImage($target, $alpha, $fuzz)
{
$iQuantumDepth = pow(2, $this->getQuantumDepth()['quantumDepthLong']);
return parent::paintTransparentImage($target, $alpha, $fuzz * $iQuantumDepth);
}
}
alain at ocarina dot fr
13 年前
fuzz 仅在 0 到 65535 的范围内工作良好。

我建议您尝试在颜色频谱图像上移动模糊。

1/ 获取颜色频谱(Google 图片有很多)

2/ 尝试此代码

<?php

function fuzzTest($source, $target, $fuzz) {

// 加载图像
$im = new Imagick($source);

// 调整图像大小以使其易于比较
$im->resizeImage(320, 240, Imagick::FILTER_LANCZOS, 1, true);

// 应用模糊
$im->paintTransparentImage($im->getImagePixelColor(0, 0), 0, $fuzz);

// 写入图像
$im->setImageFormat('png');
$im->writeImage($target);
$im->destroy();

return
true;
}

for (
$i = 0; ($i <= 10); $i++) {
fuzzTest('spectrum.png', "test_{$i}.png", (6553.5 * $i));
echo
'<img src="test_' . $i . '.png" />&nbsp;';
}

?>
To Top