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