在cpp中创建颜色变化

时间:2011-09-21 14:34:23

标签: c++ qt colors variation

我有一种给定的颜色,想要在色调,饱和度和亮度方面创造它的变化。

我找到了一个按照我希望的方式创建变体的网页(参见http://coloreminder.com/)。但是,我并不完全理解如何为任意颜色创建这些变体。从我在这个主页上考虑创建变体时可以看出,仅仅单独更改HSL值以创建变体似乎是不够的。

因此,我想询问是否有人知道创建这些变体的方法,或者理想地知道在我自己的程序中采用这种颜色变化创建的代码的平和点在哪里?

我正在使用c ++和QT。

感谢您的帮助, 马克

编辑:谢谢你的回复!实际上,给定主页的变化实际上仅以10%的步长分别改变HSL值。我感到困惑,因为我在我的程序的颜色选择器中将值与HSV值进行了比较。

2 个答案:

答案 0 :(得分:1)

您是否阅读了QColor的文档?

QColor类本身提供了许多有用的功能,可以用你能想到的任何方式操作颜色,文档本身也解释了一些基本的颜色理论。

答案 1 :(得分:1)

  

从我在这个主页上考虑创建的变体可以看出,仅仅单独更改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

使用“goldenrod”样本颜色,如:

colorwheel('daa520', 9);

我得到:sample output

第一行是色调的变化,第二行是饱和度,第三行是值。输出与ones on the coloreminder.com不完全对应,但这可以通过颜色空间的差异和排列中使用的精确值来解释。