Есть изображения, в которых я хочу удалить фон (или установить его на прозрачный). По этой причине я протестировал команду bash imagick, которая выглядит так:
[CN0]] -channel -bordercolor белый -border
Поскольку мне нужно использовать это в моем 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%
в командной строке, независимо от того, какое значение я получаю. Я делаю что-то неправильно или есть ошибка (которая оставила бы меня искать другой скрипт, способный это сделать)?
Я делаю что-то неправильно или есть ошибка
Позвольте называть это ошибкой документации.
Imagick :: floodFillPaintImage (и большинство других функций, которые принимают параметр fuzz) должны иметь пух, масштабированный до квантового диапазона, с которым был скомпилирован ImageMagick. например, для ImageMagick, скомпилированного с 16 бит глубины, квантовый диапазон будет (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.... которое равно нулю.
Bash prompt
. Это просто нормальнаяBash command
.