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

Мне нужно создать красную, зеленую и фиолетовую (и, если возможно, желтую) версии следующего изображения:

Исходное изображение здесь: https://github.com/jsx97/test/blob/main/folder.png

Для этого я использую

magick input.png -colorspace gray -fill red -tint 100 output-red.png
magick input.png -colorspace gray -fill green -tint 100 output-green.png
etc.

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

Но на красном изображении вы этого не увидите:

Как я могу создать такие версии красного, зеленого и т. д. с более сбалансированными цветами? Может быть, нам нужно сначала перейти на Lab или LCH?

этот вопрос может лучше подойти для superuser.com/questions/tagged/imagemagick. речь идет не о программировании или разработке программного обеспечения, а о художественном использовании программы.

Christoph Rackwitz 22.05.2024 07:54

Похоже, это ошибка в пакете, который вы используете (или в том, как вы его используете). Яркость не сохраняется, когда вы тонируете вещь в красный цвет на 100%. Я получаю L~100 в самой темной части голубой папки RGB {0,127,200} и L~154 в самой темной части красной папки {255,52,52}. Попробуйте оттенить 90 и посмотрите, что будет потом. Немного странно, что голубой цвет имеет примерно в 2 раза большую яркость изображения. Я ожидаю, что желтый будет ближе к правильному (но я могу ошибаться). Используйте подходящий инструмент обработки изображений: монохромное, затем разделите его на RGB и при необходимости повторно объедините.

Martin Brown 22.05.2024 11:53
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
153
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Возможно, это не совсем то, что вы ищете, но вы можете сделать разумный сдвиг оттенка с помощью операции ImageMagick «-modulate». Эта команда создаст 6 выходных изображений, показывающих 6 цветов, равномерно разделенных по шкале оттенков. (Я добавил их к одному изображению и изменил их размер для этого примера.)

magick folder.png -duplicate 5 -modulate 100,100,%[fx:t*200/n] +append -resize 25% result.png

При этом используется выражение FX для равномерного расчета сдвига оттенка по всему диапазону и создается такой результат...

Я добавил примерно 1/12 к сдвигу оттенка, добавив 16 к расчету «-modulate», чтобы получить немного другой набор цветов. Экспериментируйте, пока не найдете какое-то изменение, которое подойдет для вашей цели.

magick folder.png -duplicate 5 -modulate 100,100,%[fx:t*200/n+16] +append -resize 25% result2.png

Чтобы изменить одно изображение, просто задайте третий аргумент для «-модуляции» любого числа от 0 до 200. Эта команда...

magick folder.png -modulate 100,100,16 result3.png

Делает этот образ...

😎 Крутая техника с выражением -duplicate и -fx.

Mark Setchell 22.05.2024 16:34

Привет, ДжиМак. Я попробовал это с ImageMagick 7.1.1-32 и Zsh 5.9 на macOS, и выдает ошибку: no matches found: 100,100,%[fx:t*200/n]. В чем может быть проблема?

user22996855 24.05.2024 08:33

А не могли бы вы объяснить, что там означает 200?

user22996855 24.05.2024 13:20

Возможно, ваша ОС требует двойных кавычек вокруг выражения FX «100,100,%[fx:t*200/n]». Третий аргумент операции модуляции сдвигает оттенок в диапазоне (по кругу) от 0 до 200; 100 — без изменений, а 0 или 200 — противоположный цвет. Выражение FX принимает номер изображения в списке «t», умноженный на количество приращений 200, разделенный на количество изображений в списке «n».

GeeMack 24.05.2024 17:14

Я не вижу, что не так с вашим результатом. Но вы можете попробовать мой сценарий Imagemagick для замены цвета на http://www.fmwconcepts.com/imagemagick/replacecolor/index.php для систем Unix Linux/Mac OSX/Windows 10/11.

Например

Вход:

replacecolor -i blue -o red -f 50 -g 100 img.png x.png

Однако это не сильно отличается от результата вашей более простой команды.

Подобно ответу Марка Сетчелла, вы можете преобразовать в оттенки серого, а затем использовать +level-colors.

magick img.png -colorspace gray +level-colors white,red x.png

Однако это делает затенение ярким вместо темного. Так что это может быть не очень хороший метод. Так что метод Марка лучше.

Привет, Фред. Я не совсем понимаю, почему Марк удалил свой ответ (возможно, он собирается это исправить), но это было magick folder.png -colorspace HSL -separate -delete 0,1 -fill red -colorize 100% result.png. Проблема в том, что по неизвестной причине при использовании Zsh (5.9) или Bash (3.2, который предустановлен в macOS) выдается всего два красных квадрата: result-0.png и result-1.png. Марк сказал, что это странно, и что у него нет клея. Может быть, ты знаешь?

user22996855 24.05.2024 13:16

@ jsx97 jsx97 Я получаю тот же результат, что и вы, на своем Mac OSX Ventura. Проблема в том, что IM 7 обрабатывает изображения с альфа-каналом, отличным от IM 6. Поэтому правильный способ выполнить его команду на IM 7 будет следующим: magick img.png \( +clone -alpha extract -write mpr:alpha +delete \) -alpha off -colorspace HSL -separate -delete 0,1 -fill red -colorize 100% mpr:alpha -alpha off -compose copy_opacity -composite result.png

fmw42 24.05.2024 17:45

Продолжение: Но это просто создает постоянный цвет, чего я и ожидал от этой команды и от него тоже. Именно это и делает -colorize 100. Итак, Марк, вероятно, осознал обе проблемы и удалил свой пост.

fmw42 24.05.2024 17:52

Возможно, это то, что он пытался сделать: magick img.png \( +clone -alpha extract -write mpr:alpha +delete \) -alpha off -colorspace HSL -separate -delete 0,1 \( +clone -fill red -colorize 100% \) -colorspace sRGB -compose multiply -composite -compose over mpr:alpha -alpha off -compose copy_opacity -composite result.png

fmw42 24.05.2024 18:01

Другой подход в Imagemagick — использовать -compose colorize. При этом оттенок синего изображения меняется на оттенок красного изображения.

magick img.png \( +clone -fill red -colorize 100 \) -compose colorize -composite x.png

Ответ принят как подходящий

Команда Марка Сетчелла дает мне два постоянных красных изображения. Похоже, проблема в том, что ImageMagick 7 обрабатывает альфа-каналы иначе, чем ImageMagick 6, плюс тот факт, что -colorize 100 просто дает постоянный цветной результат. Так что, возможно, именно это он и пытался сделать.

magick img.png \
\( +clone -alpha extract -write mpr:alpha +delete \) \
-alpha off -colorspace HSL -separate -delete 0,1 \
\( +clone -fill red -colorize 100% \) -colorspace sRGB \
-compose multiply -composite -compose over \
mpr:alpha -alpha off -compose copy_opacity -composite result.png

Или используйте -compose softlight вместо multiply:

magick img.png \
\( +clone -alpha extract -write mpr:alpha +delete \) \
-alpha off -colorspace HSL -separate -delete 0,1 \
\( +clone -fill red -colorize 100% \) -colorspace sRGB \
-compose softlight -composite -compose over \
mpr:alpha -alpha off -compose copy_opacity -composite result.png

Или используйте -compose overlay:

magick img.png \
\( +clone -alpha extract -write mpr:alpha +delete \) \
-alpha off -colorspace HSL -separate -delete 0,1 \
\( +clone -fill red -colorize 100% \) -colorspace sRGB \
-compose overlay -composite -compose over \
mpr:alpha -alpha off -compose copy_opacity -composite result.png

Или -compose pegtoplight:

magick img.png \
\( +clone -alpha extract -write mpr:alpha +delete \) \
-alpha off -colorspace HSL -separate -delete 0,1 \
\( +clone -fill red -colorize 100% \) -colorspace sRGB \
-compose pegtoplight -composite -compose over \
mpr:alpha -alpha off -compose copy_opacity -composite result.png

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