如何遍历 RGB 中的可见光谱?
Posted
技术标签:
【中文标题】如何遍历 RGB 中的可见光谱?【英文标题】:How do I iterate through the visible spectrum of colours in RGB? 【发布时间】:2014-01-05 11:45:10 【问题描述】:我正在使用 freeglut 在屏幕上绘制一些形状,并希望根据与每个对象关联的值来调整它们的颜色。值范围从0.0
到1.0
,我希望这些代表鲜红色到紫色,数字在可见光谱中呈线性缩放。
问题是,我需要用 RGB 颜色代码(每种颜色代码为 0.0 到 1.0)来表示这些。有没有一些简单的方法来实现这一点?
【问题讨论】:
RGB 不是一个很好的色彩空间。我会考虑在HSL or HSV 中工作,它有一个“色调”轴,然后在必要时转换回 RGB。 您可以使用 HSL 颜色轻松完成此操作,迭代颜色通道并将其转换为 RGB 您会遇到的主要问题是,RGB 并没有覆盖大部分可见色彩空间。如果您真的想代表整个可见光谱,您将不得不在广色域色彩空间中工作,或者更好的是在接触色彩空间中工作。但请注意,没有 广泛可用的显示设备能够表示所有可见颜色;从技术上讲,它可以通过现有技术使用在其滤色轮中使用超过 3 种颜色的视频投影仪来完成。 这是我的更好的波长 -> RGB 转换:***.com/a/22681410/2521214 【参考方案1】:感谢 cmets,我不知道 HSV。我在网上找到了以下内容:
void pSetHSV( float h, float s, float v )
// H [0, 360] S and V [0.0, 1.0].
int i = (int)floor(h/60.0f) % 6;
float f = h/60.0f - floor(h/60.0f);
float p = v * (float)(1 - s);
float q = v * (float)(1 - s * f);
float t = v * (float)(1 - (1 - f) * s);
switch (i)
case 0: glColor3f(v, t, p);
break;
case 1: glColor3f(q, v, p);
break;
case 2: glColor3f(p, v, t);
break;
case 3: glColor3f(p, q, v);
break;
case 4: glColor3f(t, p, v);
break;
case 5: glColor3f(v, p, q);
来源:http://forum.openframeworks.cc/t/hsv-color-setting/770
【讨论】:
为什么常规的 RGB 空间不起作用? astrouw.edu.pl/~jskowron/colors-x11/rgb.html 之类的东西?以上是关于如何遍历 RGB 中的可见光谱?的主要内容,如果未能解决你的问题,请参考以下文章