首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >OpenGL通用语言中从RGB到HSV的转换

OpenGL通用语言中从RGB到HSV的转换
EN

Stack Overflow用户
提问于 2013-02-27 01:53:21
回答 1查看 37.7K关注 0票数 31

我需要从RGB颜色空间传递到HSV。我在互联网上搜索,发现了两种不同的实现,但它们给了我不同的结果:

答:

代码语言:javascript
代码运行次数:0
运行
复制
precision mediump float;
 vec3 rgb2hsv(float r, float g, float b) {

     float h = 0.0;
     float s = 0.0;
     float v = 0.0;

     float min = min( min(r, g), b );
     float max = max( max(r, g), b );
     v = max;               // v

     float delta = max - min;

     if( max != 0.0 )
         s = delta / max;       // s
     else {
         // r = g = b = 0       // s = 0, v is undefined
         s = 0.0;
         h = -1.0;
         return vec3(h, s, v);
     }
     if( r == max )
         h = ( g - b ) / delta;     // between yellow & magenta
     else if( g == max )
         h = 2.0 + ( b - r ) / delta;   // between cyan & yellow
     else
         h = 4.0 + ( r - g ) / delta;   // between magenta & cyan

     h = h * 60.0;              // degrees

     if( h < 0.0 )
         h += 360.0;

     return vec3(h, s, v);
 }

B:

代码语言:javascript
代码运行次数:0
运行
复制
 precision mediump float;
 vec3 rgb2hsv(float r, float g, float b) {

     float K = 0.0;
     float tmp;

     if (g < b)
     {
         tmp = g;
         g=b;
         b=tmp;

         K = -1.0;
     }

     if (r < g)
     {
         tmp = r;
         r=g;
         g=tmp;

         K = -2.9 / 6.9 - K;
     }

     float chroma = r - min(g, b);

     float h = abs(K + (g - b) / (6.0 * chroma + 1e-20));
     float s = chroma / (r + 1e-20);
     float v = r;

     return vec3(h, s, v);
 }

你知道哪个是正确的实现吗?

EN

回答 1

Stack Overflow用户

发布于 2013-02-27 03:44:53

我没有可以检查的开发环境,但是您可以使用wolframAlpha来构建一些断言。

单纯疱疹病毒的For Instance: rgb(1,0,0)(纯红)为0,100%,100%。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15095909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档