Я пытаюсь понять, как ограничить -trim определенным цветом. Я пытался
magick input.png -background yellow -trim +repage output.png
magick input.png -background #ffff00 -trim +repage output.png
и любая из этих команд удаляет желтый цвет. Но если желтый уже удален, тогда он удаляет и красный. Как это следует исправить?
То есть, как сделать так, чтобы при отсутствии желтого цвета по краям изображения команда ничего не обрезала?





Вы можете получить цвет верхнего левого пикселя следующим образом, а затем добавить свою собственную логику относительно того, следует ли обрезать его или нет:
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:
Идея состоит в том, что вы запускаете мою команду, а затем решаете, запускать ли команду обрезки, на основе моих результатов.
Но что, если мне нужно пакетно обрезать 100 изображений (то есть вокруг некоторых из них есть желтые пиксели, а вокруг некоторых нет)? Вы имеете в виду, что в таком случае необходимо будет написать сценарий оболочки, который будет запускаться magick, чтобы получить цвет верхнего левого пикселя каждого изображения, затем сценарий должен сравнить это значение со значением, которое я бы указал в сценарии. сам по себе, а затем скрипт будет использовать if/else, чтобы решить, обрезать или не обрезать, верно?
Другими словами, вы имеете в виду, что ImageMagick не предоставляет возможности ограничить -trim определенным цветом, и поэтому единственный вариант — как-то обойти это?
Правильный. Написать сценарий оболочки не должно быть слишком сложно. Я не верю, что ImageMagick может обрезать только указанный цвет, но не спешите принимать мой ответ, иначе кто-то другой может придумать что-то получше.
Важное примечание к ответу Марка: в Zsh первая команда должна быть magick F0ZZyetV.png -format "%[hex:p{0,0}]" info:
Вы можете ограничить его некоторым цветом, указав цвет фона в 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 будет просто синим.
Это очень странно. Я получаю те же результаты, что и вы. Я не уверен, что понимаю это. Я даже установил фазз на 0. Мне придется обсудить это с разработчиками IM, чтобы убедиться, что я неправильно понял.
Вот еще одна версия. Я удалил -fuzz, потому что не думаю, что это необходимо для PNG, а также намеренно заменил цвет -background на зеленый. Команда по-прежнему обрезает желтый цвет, а затем красный. Кажется, -background просто игнорируют. magick yellow.png -alpha off -background "rgb(0,255,0)" -trim +repage yellow.png
Обходным решением было бы поставить условие IF вокруг команды fuzz, проверяющей верхний левый угол (или все 4 угла, или все четыре внешних строки и столбца), если он близок к вашему цвету, не делайте обрезку.
Судя по моему последнему комментарию, это ошибка. С другой стороны, похоже, для Марка такое поведение IM не стало неожиданностью.
Ваша уменьшенная версия — PNG, а не JPG. Вы конвертировали PNG в JPG, а затем конвертировали JPG в PNG? Или у вас загрузка изображений с форума не конвертировалась из JPG в PNG?
Я загрузил сюда PNG, но кажется, что Stack Overflow преобразовал его в JPEG, а затем обратно в PNG. Версия на GitHub выглядит как «настоящий» PNG.
Я не уверен, что в настоящее время это должно работать для меня таким образом. Вполне возможно, что цвет -background используется (сейчас) только с режимом -define Trim:percent-background=0% удаления цвета фона. Я только что увидел комментарий -background в документации -trim, попробовал его на вашем маленьком изображении и обнаружил, что он работает. Я сейчас не понимаю, почему это работает на этом изображении.
Почему вы говорите, что этот форум преобразовал ваш PNG в JPG, а затем в PNG? Откуда ты это знаешь?
@jsx Это работает как для маленьких, так и для больших файлов PNG, если вы добавите в команду -define Trim:percent-background=0%, чтобы она обрезала только этот цвет. Я отредактировал свой пост выше с этим.
"Откуда ты это знаешь?" — Исходный PNG на моем Mac и изображение с GitHub, если я загрузлю его обратно, не будут иметь визуальных артефактов. Изображение из Stack Overflow, если я его скачаю и увеличу, то тут и там обнаружит множество визуальных артефактов. Причина появления визуальных артефактов, на мой взгляд, заключается в том, что изображение было конвертировано в формат с потерями, а затем обратно в PNG.
Использование -define trim:percent-background=0% мне помогает, большое спасибо. Вероятно, это следует добавить к самому ответу. А еще, Фред, что ты думаешь о моем ответе здесь: stackoverflow.com/a/78624021. Как вы думаете, это хорошо или с этим есть какие-то проблемы? Решение этой задачи для меня действительно важно.
Я уже добавил это. Вы читали мои комментарии выше? В вашей ссылке вы добавили рамку вокруг. Если ваш код добавляет границу справа и снизу, вы можете получить дополнительную границу в дальних строках и столбцах (справа и внизу) ваших культур. Если вас не волнуют излишки справа и снизу, то это нормальное решение.
@Марк Сетчелл. Да, извините, я забыл это добавить. Я сделаю так.
Не могли бы вы показать, как изменить команду, чтобы она обрезала только прозрачные пиксели (в файлах PNG)? Я пробовал magick input.png -background none -define trim:percent-background=0% -trim +repage output.png, а также пытался заменить none на transparent или на "rgba(0, 0, 0, 0.0)", но, похоже, для завершения требуется неопределенное время (= навсегда).
Вы должны быть уверены, что изображение под прозрачностью является постоянным черным, иначе нет ни одного прозрачного цвета. magick input.png -background black -alpha background -background none -define trim:percent-background=0% -trim +repage output.png
Не знаю, почему у меня это не работает. Вот тестовое изображение: github.com/jsx97/test/blob/main/x.png. Если я попытаюсь обрезать его с помощью вашей команды, это займет неопределенное время.
Ваше изображение или загрузка были повреждены для меня. Попробуйте опубликовать еще раз.
Это работает для вас? magick image.png -background black -alpha background -background none -trim +repage output.png. Это то что ты хочешь? По-видимому, использование -trim:percent с прозрачным изображением обрезает все (по крайней мере, для меня с моим тестовым изображением), и я получаю сообщение об ошибке о геометрии. Не знаю, почему вы не получаете это сообщение об ошибке сразу.
Эта команда работает для меня на другом простом тестовом изображении. magick x.png -background none -define trim:percent-background=0% -trim +repage output.png. Мне нужно увидеть тестовое изображение, которое вы используете, которое не удалось. Если внутри непрозрачных частей есть прозрачность, команда продолжит обрезку, пока ничего не останется.
Ваша первая команда обрезает не только прозрачные пиксели, но и непрозрачные (если прозрачные уже обрезаны). Для выполнения вашей второй команды у меня требуется неопределенное время. Загруженное мной тестовое изображение представляет собой снимок экрана веб-страницы, созданный Safari, и его можно исправить с помощью magick input.png -trim +repage output.png. Не могу сказать наверняка, но подозреваю, что по краям у него большое количество прозрачных пикселей, поэтому его нельзя открыть без предварительной обрезки.
Пожалуйста, предоставьте свое изображение в формате x.png. Это было сломано для меня. Параметр -define Trim:percent-background=0% используется для обрезки ВСЕХ пикселей заданного цвета снаружи внутрь до тех пор, пока не останутся только непрозрачные. Вот почему мне нужно увидеть ваше настоящее изображение. Пожалуйста, прочитайте документацию по адресу imagemagick.org/script/command-line-options.php#trim.
Я перезалил это: x_reuploaded . А еще я сделал еще одну версию с помощью Safari и загрузил ее: y.png. Обратите внимание, что вы, вероятно, не сможете открыть (= просмотреть) их до обрезки (например, magick x_reuploaded.png -trim +repage trimmed.png). Я подозреваю, что это из-за огромного количества прозрачных пикселей вокруг них, но я не совсем уверен.
Оба новых изображения у меня не работают в браузере Safari и Chrome. Возможно, сначала заархивируйте их и посмотрите, поможет ли это. Каковы размеры изображений? Я сомневаюсь, что они слишком большие.
Изображение не повреждено, оно просто слишком велико для Safari или Chrome (или предварительного просмотра). Мне удалось открыть x_reuploaded.png в GIMP: размер холста 2488 x 218628 пикселей, внизу и вверху есть прозрачные области. Вот как выглядит непрозрачная часть, если просмотреть ее в GIMP с масштабом 3%: 3perc.png . А вот как выглядит все изображение, если просмотреть его с увеличением 0,4%: 0dot4perc.png.
На всякий случай (хотя я уверен, что это не имеет значения) я также загрузил его в формате .zip: x_reuploaded.png.zip.
PNG по-прежнему поврежден после распаковки.
Марк, большое спасибо, но я не уверен, что понимаю твою идею. Мне не нужно получать цвет верхнего левого пикселя с помощью ImageMagick просто потому, что я уже знаю, какой это цвет, например.
ffff00. Я прошу команду, которая будет обрезатьffff00края, но не будет обрезать, например,ff0000края или края любого другого цвета. Смотрите изображение со стрелками в моем вопросе.