如何绘制好的RGB色彩图?

Dan*_*ner 12 iphone core-graphics objective-c ios

我正在尝试绘制一个完整的RGB颜色贴图,最终将允许用户通过在任何位置点击该可视贴图来选择颜色.我目前的代码如下:

- (void)drawRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext();

    for (float x=0; x<320; x++) {
        for (float y=0; y<416; y++) {

            float r = x / 320;
            float g = y / 416;
            float b = (y < 208) ? y / 208 : (416 - y) / 208;

            CGContextSetRGBFillColor(c, r, g, b, 1.0);
            CGContextFillRect(c, CGRectMake(x, y, 1, 1));

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果还不错,但我还不满意.光谱错过了包括白色在内的鲜艳色彩.原因很清楚:红色,绿色和蓝色不会同时达到1.0.

生成的颜色映射的屏幕截图

您是否有任何建议如何改进该地图,以便它代表RGB色彩空间的全部光谱?

感谢您的输入!

更新:

正如Josh Caswell所建议的,我使用了HSB颜色空间和以下代码:

- (void)drawRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext();

    int size = 20;

    for (float x=0; x<320; x+=size) {

        float s = x < 160 ? 1       : (320 - x) / 160;
        float b = x < 160 ? x / 160 : 1;

        for (float y=0; y<416; y+=size) {

            float h = y / 416;

            [[UIColor colorWithHue:h saturation:s brightness:b alpha:1.0] setFill];
            CGContextFillRect(c, CGRectMake(x, y, size, size));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这导致以下输出完全满足我的需要.

使用HSB颜色空间的结果

感谢所有输入!

Jos*_*ell 7

好吧,你试图将一个三维物体压平在一个平面上.RGB颜色基本上代表立方体内的一个点.将RGB实体映射到表面上可以在数学上是可能的,但是对于这种颜色选择目的可能不是特别直观.

你可能有更好的运气使用HSB,它更像是一个圆柱体周围角色的圆柱体.您可以"展开"圆柱体,将色调映射到y坐标,然后沿x轴改变亮度或饱和度 - 您可以进行一些简单的测试来确定哪个组件对您的应用更重要.如果您认为有必要将双指滑动用于第三个组件,则可以使用双指滑动.

在X轴上饱和的HSB:
HSB地图;  S在X轴上

X轴亮度:
HSB地图;  B轴在X轴上

饱和度和亮度相等且均在X轴上:
HSB地图;  X轴为S = B.

如果您需要白色,当S = 0%,B = 100%时,您可以沿着一侧粘贴条带,或尝试S = 1/B.