想象一下:将bash命令转换为php脚本

时间:2015-08-22 10:52:06

标签: php imagick

有些图像我要删除背景(或将其设置为透明)。出于这个原因,我测试了一个看起来像这样的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%时的结果相同,无论我传递的是什么模糊值。我做错了什么或是否有错误(这会让我寻找能够做到这一点的另一个脚本)?

1 个答案:

答案 0 :(得分:1)

  

我做错了什么或有错误

我们称之为文档错误。

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模糊的原因相同的原因是,ImageMagick正在将您传入的2的值解释为2/65535 ....这几乎为零。