Создание цветовых вариаций в cpp - PullRequest
1 голос
/ 21 сентября 2011

У меня есть данный цвет, и я хочу создать его вариации с точки зрения оттенка, насыщенности и яркости.

Я нашел веб-страницу, которая создает варианты так, как мне бы хотелось (см. http://coloreminder.com/). Однако я не совсем понимаю, как эти варианты создаются для произвольного цвета. Из того, что я могу сказать из рассмотрения созданных вариантов на этой домашней странице, кажется, что этого недостаточно, чтобы просто отдельно изменить значения HSL для создания вариантов.

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

Я использую c ++ и QT.

Спасибо за вашу помощь, Marc

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы! На самом деле вариации данной домашней страницы действительно только изменяют значения HSL отдельно в 10% шагов. Я запутался, поскольку сравнивал значения со значениями HSV в палитре цветов моей программы.

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

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

В самом деле? Интерфейс кажется достаточно понятным о том, какие изменения он вносит. Вы можете выбрать «оттенок», «насыщенность» или «яркость», и он показывает 9 вариаций на этом канале. Следующий скрипт MATLAB будет отображать различные варианты аналогичным образом (хотя в цветовом пространстве HSV, а не HSL).

% display n variations of HTML-style color code.
function [] = colorwheel ( hex, n )
      % parse color code.
    rgb = hex2rgb(hex);
      % render all variations.
    h = figure();
    for j = 1 : 3,
          % build n variations on current channel.
        colors = variantsof(rgb, j, n);
          % display variations.
        for i = 1 : n,
              % generate patch of specified color.
            I = zeros(128, 128, 3);
            I(:,:,1) = colors(i, 1);
            I(:,:,2) = colors(i, 2);
            I(:,:,3) = colors(i, 3);
              % render patches side-by-side to show progression.
            imshow(I, 'parent', ...
                subplot(3, n, (j-1)*n+i, 'parent', h));
        end
    end
end

% parse HTML-style color code.
function [ rgb ] = hex2rgb ( hex )
    r = double(hex2dec(hex(1:2))) / 255;
    g = double(hex2dec(hex(3:4))) / 255;
    b = double(hex2dec(hex(5:6))) / 255;
    rgb = [r g b];
end

% generate n variants of color on j-th channel.
function [ colors ] = variantsof ( rgb, j, n )
    colors = zeros(n, 3);
    for i = 1 : n,
          % convert to HSV.
        color = rgb2hsv(rgb);
          % apply variation to selected channel.
        color(j) = color(j) + ((i-1) / n);
        if color(j) > 1.0,
            color(j) = color(j) - 1.0;
        end
          % convert to RGB.
        colors(i,:) = hsv2rgb(color);
    end
      % order colors with respect to channel.
    if j > 1,
        colors = sortrows(colors, j);
    end
end

Используя образец цвета "золотарник", как:

colorwheel('daa520', 9);

Я получаю: sample output

Первый ряд - это изменение оттенка, второй - по насыщенности, а третий - по значению. Выходные данные не точно соответствуют на coloreminder.com , но это объясняется разницей в цветовом пространстве и точном значении, используемом в перестановках.

1 голос
/ 21 сентября 2011

Прочитали ли вы документацию для QColor ?

Сам класс QColor предоставляет множество полезных функций для манипулирования цветами практически любым удобным для вас способом, а сама документация также объясняет некоторые основные теории цвета.

...