Поэтому я пытаюсь обрезать границы изображения с помощью функции imagemagick trimimage (PHP), основанной на цвете фона. Ниже приведена демонстрация того, что я пытаюсь сделать, и в чем проблема.
Когда я загружаю это изображение (это изображение имеет толстые белые рамки сверху и справа):
И запустите следующий код:
$canvas->setBackgroundColor('#ffffff');
$quantumRange = $canvas->getQuantumRange();
$canvas->trimImage(0.3 * $quantumRange['quantumRangeLong']);
$canvas->setImagePage(0, 0, 0, 0);
Результат - именно то, что я ожидаю: белые рамки обрезаются.
Однако, используя изображение ниже (без внешних границ):
и при выполнении того же кода изображение обрезается изнутри (?) С некоторыми странными эффектами:
Теперь, исходя из того, что я понял, тримидж должен брать цвет фона и обрезать его снаружи вовнутрь, и только если внешние поля изображения (границы) соответствуют этому цвету.
Итак, я неправильно понял trimimage или что-то упустил в реализации. Кроме того, играть со значением fuzz не вариант. В какой-то момент он прекратит обрезку синей границы, но в этот момент он также НЕ будет обрезан достаточно, если есть внешние границы, так как мне нужно иметь достаточно высокое значение, чтобы также удалить светлые тени или артефакты сжатия.
Итак, актуальные вопросы:
1. Есть ли способ обрезать изображение только снаружи, когда цвет внешней границы совпадает с цветом фона? Может быть, я что-то пропустил.
2. Есть ли другой способ, который вы могли бы порекомендовать?
EDIT:
После того, как @ fmw42 ответил ниже, я поближе посмотрел, что такое обнаружение краев и как оно работает. Мое предположение состояло в том, что imagemagick смотрит на границы изображения и обрезает их, основываясь на заданном цвете фона, что неправильно. Чтобы лучше понять, как работает распознавание кромок: https://en.wikipedia.org/wiki/Edge_detection
Спасибо.