Как сделать цветовую прогрессию из цветовой палитры

Моя цель с этим алгоритмом, над которым я работаю, - вывести цветовую прогрессию из некоторых предоставленных цветов. Под цветовой прогрессией я подразумеваю создание эффекта «затухания» между двумя цветами (цвет A, цвет B) и сохранение каждого значения цвета ((R, G, B) кортеж) между ними.

Например, если предоставлено общее количество черного A = (0,0,0) и всего белого B = (255,255,255), результат прогрессии будет:

P = ((0,0,0),(1,1,1),(2,2,2), .... ,(253,253,253),(254,254,254),(255,255,255)

Так что сначала мы получаем белый цвет, а затем он постепенно превращается в черный. Это, конечно, очень просто с белым и черным (просто увеличивайте RGB на один каждый шаг в 255 раз). Но что, если я хочу выполнить эту процедуру с двумя произвольными цветами, например A = (180,69,1) и B = (233,153,0) ??

ВАЖНОЕ ПРИМЕЧАНИЕ: если с шестнадцатеричным (или любым другим типом цветового обозначения) этого будет легче достичь, я мог бы работать и с этим, просто укажите, какой тип (примите во внимание, что я работаю над PIL (Python Imaging Library) , так что если он совместим с этим, я в порядке)

Очевидно, что это должно быть как можно более равномерное распределение, прогрессия должна быть однородной.

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

Заранее спасибо.


person Daniel Wright    schedule 05.05.2011    source источник


Ответы (4)


Преобразуйте свои координаты RGB в HSL или HSV и переходите по ним, попутно конвертируя обратно в RGB.

person Ignacio Vazquez-Abrams    schedule 05.05.2011
comment
docs.python.org/library/colorsys.html en.wikipedia.org/wiki/HSL_and_HSV - person Ignacio Vazquez-Abrams; 05.05.2011
comment
У меня проблема. Я не знаю, как переключаться между цветами HSL и HSV: / - person Daniel Wright; 06.05.2011
comment
Как бы вы переходили между цветами RGB? - person Ignacio Vazquez-Abrams; 06.05.2011
comment
Я знаю, что не могу пройти через RGB, но не могли бы вы рассказать мне, как пройти через HSV или HSL? Спасибо - person Daniel Wright; 06.05.2011
comment
Думаю, я просто придумал хороший маленький алгоритм, чтобы решить эту проблему, ура! В любом случае спасибо: D - person Daniel Wright; 06.05.2011

Я бы просто интерполировал значения RGB независимо. См. Эту ветку.

person Jim Clay    schedule 05.05.2011

Я рекомендую тот же вопрос, что и Джим Клей, но читайте в верхней части. или см. Википедию относительно интерполяции.

person Melinda Green    schedule 08.11.2012

Мой ответ на вопрос SO под названием от значений диапазона до псевдоцвета может быть полезным. вам, потому что он показывает один из способов создания определенного цветового градиента (общее название того, что вы называете цветовой прогрессией).

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

Затем, начиная со значения каждого из компонентов первого цвета, соответствующее дробное количество может быть добавлено к нему снова и снова, чтобы определить цвет каждого промежуточного шага. В качестве альтернативы, арифметическая ошибка, присущая этому подходу, может быть уменьшена путем добавления (step_number/total_steps) * fractional_delta к начальным значениям компонентов цвета начального цвета.

Я считаю, что это то, что @Jim Clay также говорит в своем ответе. Если вам нужен образец кода, скажите об этом в комментарии.

person martineau    schedule 14.06.2012