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)
这导致以下输出完全满足我的需要.

感谢所有输入!
好吧,你试图将一个三维物体压平在一个平面上.RGB颜色基本上代表立方体内的一个点.将RGB实体映射到表面上可以在数学上是可能的,但是对于这种颜色选择目的可能不是特别直观.
你可能有更好的运气使用HSB,它更像是一个圆柱体周围角色的圆柱体.您可以"展开"圆柱体,将色调映射到y坐标,然后沿x轴改变亮度或饱和度 - 您可以进行一些简单的测试来确定哪个组件对您的应用更重要.如果您认为有必要将双指滑动用于第三个组件,则可以使用双指滑动.
在X轴上饱和的HSB:

X轴亮度:

饱和度和亮度相等且均在X轴上:

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