Imagick: конвертировать команду bash в скрипт php

1

Есть изображения, в которых я хочу удалить фон (или установить его на прозрачный). По этой причине я протестировал команду 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% в командной строке, независимо от того, какое значение я получаю. Я делаю что-то неправильно или есть ошибка (которая оставила бы меня искать другой скрипт, способный это сделать)?

  • 0
    Это не Bash prompt . Это просто нормальная Bash command .
  • 0
    @ArkadiuszDrabczyk извините, конечно, вы правы. Я буду редактировать
Показать ещё 2 комментария
Теги:
imagick

1 ответ

1
Лучший ответ

Я делаю что-то неправильно или есть ошибка

Позвольте называть это ошибкой документации.

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.... которое равно нулю.

  • 0
    черт. Это имеет смысл. Спасибо :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню