Imagick:将 bash 命令转换为 php 脚本

Imagick: Convert bash command into php script

有些图像我想删除其背景(或者将其设置为透明)。出于这个原因,我测试了一个 bash imagick 命令,它看起来像这样:

convert test.jpg -alpha set -channel RGBA -bordercolor white -border 1x1 -fuzz 2% -fill none -floodfill +0+0 white -shave 1x1 test.png

因为我需要在我的 php 脚本中使用它,所以我现在需要翻译它。我想出的是:

$imagick->readImage($path);
$imagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET);
$imagick->borderImage('white', 1, 1);
$imagick->floodFillPaintImage('transparent', 20, 'white', 0, 0, false);
$imagick->shaveImage(1, 1);
$imagick->writeImage(str_replace('.jpg', '.png', $path));

据我所知,它生成了图像并删除了大部分背景。但是模糊设置似乎被忽略了。

此脚本的结果 始终 与我在命令提示符中使用 -fuzz 0% 时相同,无论我传递的模糊度值是多少。我是做错了什么还是有错误(这会让我搜索另一个能够执行此操作的脚本)?

Am I doing something wrong or is there a bug

我们称之为文档错误。

Imagick::floodFillPaintImage(以及大多数其他采用模糊参数的函数)需要将模糊缩放到 ImageMagick 编译时使用的量子范围。例如对于使用 16 位深度编译的 ImageMagick,量子范围将为 (2^16 - 1) = 65535

http://phpimagick.com/Imagick/floodFillPaintImage

有一个例子
$imagick->floodFillPaintImage(
    $fillColor,
    $fuzz * \Imagick::getQuantum(),
    $targetColor,
    $x, $y,
    $inverse,
    $channel
);

所以您看到输出图像与传入 0 fuzz 相同的原因是 ImageMagick 将您传入的值 2 解释为 2 / 65535 ....大约为零。