Функция Trimamage Imagemagick также обрезается, когда внутри изображения присутствует цвет фона (не только границы) - PullRequest
0 голосов
/ 13 сентября 2018

Поэтому я пытаюсь обрезать границы изображения с помощью функции imagemagick trimimage (PHP), основанной на цвете фона. Ниже приведена демонстрация того, что я пытаюсь сделать, и в чем проблема.

Когда я загружаю это изображение (это изображение имеет толстые белые рамки сверху и справа): enter image description here

И запустите следующий код:

$canvas->setBackgroundColor('#ffffff');
$quantumRange = $canvas->getQuantumRange();
$canvas->trimImage(0.3 * $quantumRange['quantumRangeLong']);
$canvas->setImagePage(0, 0, 0, 0);

Результат - именно то, что я ожидаю: белые рамки обрезаются. enter image description here

Однако, используя изображение ниже (без внешних границ): enter image description here

и при выполнении того же кода изображение обрезается изнутри (?) С некоторыми странными эффектами: enter image description here

Теперь, исходя из того, что я понял, тримидж должен брать цвет фона и обрезать его снаружи вовнутрь, и только если внешние поля изображения (границы) соответствуют этому цвету.

Итак, я неправильно понял trimimage или что-то упустил в реализации. Кроме того, играть со значением fuzz не вариант. В какой-то момент он прекратит обрезку синей границы, но в этот момент он также НЕ будет обрезан достаточно, если есть внешние границы, так как мне нужно иметь достаточно высокое значение, чтобы также удалить светлые тени или артефакты сжатия.

Итак, актуальные вопросы: 1. Есть ли способ обрезать изображение только снаружи, когда цвет внешней границы совпадает с цветом фона? Может быть, я что-то пропустил. 2. Есть ли другой способ, который вы могли бы порекомендовать?

EDIT: После того, как @ fmw42 ответил ниже, я поближе посмотрел, что такое обнаружение краев и как оно работает. Мое предположение состояло в том, что imagemagick смотрит на границы изображения и обрезает их, основываясь на заданном цвете фона, что неправильно. Чтобы лучше понять, как работает распознавание кромок: https://en.wikipedia.org/wiki/Edge_detection

Спасибо.

1 Ответ

0 голосов
/ 13 сентября 2018

Imagemagick -trim будет обрезаться с каждой стороны, только если цвет стороны находится в пределах значения fuzz.Ваш белый фон ничего не делает.Функция -trim просматривает цвета ребер и обрезает их до тех пор, пока строки и столбцы ребер не превысят значение fuzz для цвета ребер.Он смотрит на угловые цвета, чтобы определить, обрезать или нет.В вашем первом случае у вас есть 3 белых угла.Так что обрежет белый сверху и справа.Во втором случае у вас есть 3 синих угла.Таким образом, он будет обрезаться внутрь сверху и справа, чтобы убрать немного синего.

Я думаю, что вы хотите сделать, это поместить 1 пиксель вокруг изображения цвета фона.В этом случае вам нужен белый.

Input1:

enter image description here

convert image1.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image_trim.jpg


Обратите внимание, что 30% эквивалентно 0,3* Квантовый диапазон

enter image description here

Изображение 2:

enter image description here

convert image2.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image2a_trim.jpg


enter image description here

Без добавления белой границы, -трима видит синий цвет как границу от 3 углов.Таким образом, он будет обрезаться синим цветом.

convert image2.jpg -fuzz 30% -trim +repage image2b_trim.jpg


enter image description here

Если вы увеличите значение fuzz до 50%, оно будет более очевидным и аккуратнымк пингвину.

convert image2.jpg -fuzz 30% -trim +repage image2c_trim.jpg


enter image description here

...