Чтобы ограничить «-trim» определенным цветом

Я пытаюсь понять, как ограничить -trim определенным цветом. Я пытался

magick input.png -background yellow -trim +repage output.png
magick input.png -background #ffff00 -trim +repage output.png

и любая из этих команд удаляет желтый цвет. Но если желтый уже удален, тогда он удаляет и красный. Как это следует исправить?

То есть, как сделать так, чтобы при отсутствии желтого цвета по краям изображения команда ничего не обрезала?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете получить цвет верхнего левого пикселя следующим образом, а затем добавить свою собственную логику относительно того, следует ли обрезать его или нет:

magick F0ZZyetV.png -format "%[hex:p{0,0}]" info:
FFFF54FF

Или:

magick F0ZZYetV.png -crop 1x1+0+0 txt:
# ImageMagick pixel enumeration: 1,1,255,srgba
0,0: (255,255,84,255)  #FFFF54FF  srgba(255,255,84,1)

Добавьте -alpha off сразу после имени входного изображения, если вы не хотите использовать альфа-канал.


Если вы хотите сравнить верхний левый пиксель с цветом RGB и посмотреть, «близок ли он», вы можете обрезать верхний левый пиксель, выполнить нечеткое сравнение с цветом RGB и подсчитать, сколько пикселей отличаются более чем на количество нечеткости. Ответом всегда будет ноль, если пиксель находится в пределах допуска, или единица, если одиночный пиксель, который мы тестируем, находится за пределами допуска:

magick F0ZZYetV.png -crop 1x1+0+0 'xc:rgb(240,240,75)' -fuzz 10% -metric AE -compare -format  "%[distortion]" info:

Марк, большое спасибо, но я не уверен, что понимаю твою идею. Мне не нужно получать цвет верхнего левого пикселя с помощью ImageMagick просто потому, что я уже знаю, какой это цвет, например. ffff00. Я прошу команду, которая будет обрезать ffff00 края, но не будет обрезать, например, ff0000 края или края любого другого цвета. Смотрите изображение со стрелками в моем вопросе.

user25418595 15.06.2024 11:38

Идея состоит в том, что вы запускаете мою команду, а затем решаете, запускать ли команду обрезки, на основе моих результатов.

Mark Setchell 15.06.2024 11:50

Но что, если мне нужно пакетно обрезать 100 изображений (то есть вокруг некоторых из них есть желтые пиксели, а вокруг некоторых нет)? Вы имеете в виду, что в таком случае необходимо будет написать сценарий оболочки, который будет запускаться magick, чтобы получить цвет верхнего левого пикселя каждого изображения, затем сценарий должен сравнить это значение со значением, которое я бы указал в сценарии. сам по себе, а затем скрипт будет использовать if/else, чтобы решить, обрезать или не обрезать, верно?

user25418595 15.06.2024 11:59

Другими словами, вы имеете в виду, что ImageMagick не предоставляет возможности ограничить -trim определенным цветом, и поэтому единственный вариант — как-то обойти это?

user25418595 15.06.2024 12:01

Правильный. Написать сценарий оболочки не должно быть слишком сложно. Я не верю, что ImageMagick может обрезать только указанный цвет, но не спешите принимать мой ответ, иначе кто-то другой может придумать что-то получше.

Mark Setchell 15.06.2024 12:25

Важное примечание к ответу Марка: в Zsh первая команда должна быть magick F0ZZyetV.png -format "%[hex:p{0,0}]" info:

user25418595 20.06.2024 14:35
Ответ принят как подходящий

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

Вход:

magick image.png -alpha off -background "rgb(255,255,84)" -define trim:percent-background=0% -fuzz 5% -trim +repage x1.png

magick x1.png -alpha off -background "rgb(255,255,84)" -define trim:percent-background=0% -fuzz 5% -trim +repage x2.png

Привет, Фред. Кажется, работает только из-за артефактов JPEG. Я загрузил версию PNG здесь: github.com/jsx97/test/blob/main/yellow.png. А если использовать PNG, x2.png будет просто синим.

user25418595 15.06.2024 18:10

Это очень странно. Я получаю те же результаты, что и вы. Я не уверен, что понимаю это. Я даже установил фазз на 0. Мне придется обсудить это с разработчиками IM, чтобы убедиться, что я неправильно понял.

fmw42 15.06.2024 18:14

Вот еще одна версия. Я удалил -fuzz, потому что не думаю, что это необходимо для PNG, а также намеренно заменил цвет -background на зеленый. Команда по-прежнему обрезает желтый цвет, а затем красный. Кажется, -background просто игнорируют. magick yellow.png -alpha off -background "rgb(0,255,0)" -trim +repage yellow.png

user25418595 15.06.2024 18:22

Обходным решением было бы поставить условие IF вокруг команды fuzz, проверяющей верхний левый угол (или все 4 угла, или все четыре внешних строки и столбца), если он близок к вашему цвету, не делайте обрезку.

fmw42 15.06.2024 18:22

Судя по моему последнему комментарию, это ошибка. С другой стороны, похоже, для Марка такое поведение IM не стало неожиданностью.

user25418595 15.06.2024 18:25

Ваша уменьшенная версия — PNG, а не JPG. Вы конвертировали PNG в JPG, а затем конвертировали JPG в PNG? Или у вас загрузка изображений с форума не конвертировалась из JPG в PNG?

fmw42 15.06.2024 18:25

Я загрузил сюда PNG, но кажется, что Stack Overflow преобразовал его в JPEG, а затем обратно в PNG. Версия на GitHub выглядит как «настоящий» PNG.

user25418595 15.06.2024 18:28

Я не уверен, что в настоящее время это должно работать для меня таким образом. Вполне возможно, что цвет -background используется (сейчас) только с режимом -define Trim:percent-background=0% удаления цвета фона. Я только что увидел комментарий -background в документации -trim, попробовал его на вашем маленьком изображении и обнаружил, что он работает. Я сейчас не понимаю, почему это работает на этом изображении.

fmw42 15.06.2024 18:28

Почему вы говорите, что этот форум преобразовал ваш PNG в JPG, а затем в PNG? Откуда ты это знаешь?

fmw42 15.06.2024 18:29

@jsx Это работает как для маленьких, так и для больших файлов PNG, если вы добавите в команду -define Trim:percent-background=0%, чтобы она обрезала только этот цвет. Я отредактировал свой пост выше с этим.

fmw42 15.06.2024 18:41

"Откуда ты это знаешь?" — Исходный PNG на моем Mac и изображение с GitHub, если я загрузлю его обратно, не будут иметь визуальных артефактов. Изображение из Stack Overflow, если я его скачаю и увеличу, то тут и там обнаружит множество визуальных артефактов. Причина появления визуальных артефактов, на мой взгляд, заключается в том, что изображение было конвертировано в формат с потерями, а затем обратно в PNG.

user25418595 15.06.2024 18:55

Использование -define trim:percent-background=0% мне помогает, большое спасибо. Вероятно, это следует добавить к самому ответу. А еще, Фред, что ты думаешь о моем ответе здесь: stackoverflow.com/a/78624021. Как вы думаете, это хорошо или с этим есть какие-то проблемы? Решение этой задачи для меня действительно важно.

user25418595 15.06.2024 19:17

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

fmw42 15.06.2024 20:31

@Марк Сетчелл. Да, извините, я забыл это добавить. Я сделаю так.

fmw42 17.06.2024 17:50

Не могли бы вы показать, как изменить команду, чтобы она обрезала только прозрачные пиксели (в файлах PNG)? Я пробовал magick input.png -background none -define trim:percent-background=0% -trim +repage output.png, а также пытался заменить none на transparent или на "rgba(0, 0, 0, 0.0)", но, похоже, для завершения требуется неопределенное время (= навсегда).

user25418595 19.06.2024 11:16

Вы должны быть уверены, что изображение под прозрачностью является постоянным черным, иначе нет ни одного прозрачного цвета. magick input.png -background black -alpha background -background none -define trim:percent-background=0% -trim +repage output.png

fmw42 19.06.2024 18:02

Не знаю, почему у меня это не работает. Вот тестовое изображение: github.com/jsx97/test/blob/main/x.png. Если я попытаюсь обрезать его с помощью вашей команды, это займет неопределенное время.

user25418595 19.06.2024 18:36

Ваше изображение или загрузка были повреждены для меня. Попробуйте опубликовать еще раз.

fmw42 19.06.2024 19:36

Это работает для вас? magick image.png -background black -alpha background -background none -trim +repage output.png. Это то что ты хочешь? По-видимому, использование -trim:percent с прозрачным изображением обрезает все (по крайней мере, для меня с моим тестовым изображением), и я получаю сообщение об ошибке о геометрии. Не знаю, почему вы не получаете это сообщение об ошибке сразу.

fmw42 19.06.2024 19:49

Эта команда работает для меня на другом простом тестовом изображении. magick x.png -background none -define trim:percent-background=0% -trim +repage output.png. Мне нужно увидеть тестовое изображение, которое вы используете, которое не удалось. Если внутри непрозрачных частей есть прозрачность, команда продолжит обрезку, пока ничего не останется.

fmw42 19.06.2024 19:59

Ваша первая команда обрезает не только прозрачные пиксели, но и непрозрачные (если прозрачные уже обрезаны). Для выполнения вашей второй команды у меня требуется неопределенное время. Загруженное мной тестовое изображение представляет собой снимок экрана веб-страницы, созданный Safari, и его можно исправить с помощью magick input.png -trim +repage output.png. Не могу сказать наверняка, но подозреваю, что по краям у него большое количество прозрачных пикселей, поэтому его нельзя открыть без предварительной обрезки.

user25418595 19.06.2024 20:37

Пожалуйста, предоставьте свое изображение в формате x.png. Это было сломано для меня. Параметр -define Trim:percent-background=0% используется для обрезки ВСЕХ пикселей заданного цвета снаружи внутрь до тех пор, пока не останутся только непрозрачные. Вот почему мне нужно увидеть ваше настоящее изображение. Пожалуйста, прочитайте документацию по адресу imagemagick.org/script/command-line-options.php#trim.

fmw42 19.06.2024 20:40

Я перезалил это: x_reuploaded . А еще я сделал еще одну версию с помощью Safari и загрузил ее: y.png. Обратите внимание, что вы, вероятно, не сможете открыть (= просмотреть) их до обрезки (например, magick x_reuploaded.png -trim +repage trimmed.png). Я подозреваю, что это из-за огромного количества прозрачных пикселей вокруг них, но я не совсем уверен.

user25418595 19.06.2024 20:53

Оба новых изображения у меня не работают в браузере Safari и Chrome. Возможно, сначала заархивируйте их и посмотрите, поможет ли это. Каковы размеры изображений? Я сомневаюсь, что они слишком большие.

fmw42 20.06.2024 00:43

Изображение не повреждено, оно просто слишком велико для Safari или Chrome (или предварительного просмотра). Мне удалось открыть x_reuploaded.png в GIMP: размер холста 2488 x 218628 пикселей, внизу и вверху есть прозрачные области. Вот как выглядит непрозрачная часть, если просмотреть ее в GIMP с масштабом 3%: 3perc.png . А вот как выглядит все изображение, если просмотреть его с увеличением 0,4%: 0dot4perc.png.

user25418595 20.06.2024 14:19

На всякий случай (хотя я уверен, что это не имеет значения) я также загрузил его в формате .zip: x_reuploaded.png.zip.

user25418595 20.06.2024 14:19

PNG по-прежнему поврежден после распаковки.

fmw42 20.06.2024 17:51

Другие вопросы по теме