Как сделать цветовую прогрессию из цветовой палитры - PullRequest
5 голосов
/ 05 мая 2011

Моя цель с этим алгоритмом, над которым я работаю, состоит в том, чтобы вывести цветовую прогрессию из некоторых предоставленных цветов. Под прогрессией цвета я подразумеваю создание эффекта «затухания» между двумя цветами (цвет 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) Библиотека изображений), поэтому, если она совместима с этим, у меня все хорошо)

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

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

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

Ответы [ 4 ]

2 голосов
/ 05 мая 2011

Конвертируйте ваши координаты RGB в HSL или HSV и пошагово проходите через них, преобразовывая обратно в RGB по пути.

0 голосов
/ 08 ноября 2012

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

0 голосов
/ 15 июня 2012

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

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

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

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

0 голосов
/ 05 мая 2011

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

...