首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C中快速,优化和准确的RGB < - > HSB转换代码

以下是一个C语言中快速、优化和准确的RGB <-> HSB(HSV)转换代码:

代码语言:c
复制
#include<stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct {
    float h;
    float s;
    float b;
} HSB;

typedef struct {
    float r;
    float g;
    float b;
} RGB;

HSB rgb2hsb(RGB in)
{
    float hue, saturation, brightness;
    float r = in.r;
    float g = in.g;
    float b = in.b;
    float cmax = (r > g) ? r : g;
    if (b > cmax) cmax = b;
    float cmin = (r < g) ? r : g;
    if (b < cmin) cmin = b;
    float delta = cmax - cmin;
    brightness = cmax;
    if (delta == 0) {
        hue = 0;
        saturation = 0;
    } else {
        saturation = delta / cmax;
        if (r == cmax)
            hue = (g - b) / delta;
        else if (g == cmax)
            hue = 2 + (b - r) / delta;
        else
            hue = 4 + (r - g) / delta;
        hue *= 60;
        if (hue < 0)
            hue += 360;
    }
    HSB out;
    out.h = hue;
    out.s = saturation;
    out.b = brightness;
    return out;
}

RGB hsb2rgb(HSB in)
{
    float hue = in.h;
    float saturation = in.s;
    float brightness = in.b;
    float h = hue / 60;
    int i = floor(h);
    float f = h - i;
    float p = brightness * (1 - saturation);
    float q = brightness * (1 - saturation * f);
    float t = brightness * (1 - saturation * (1 - f));
    float r, g, b;
    switch (i) {
        case 0:
            r = brightness;
            g = t;
            b = p;
            break;
        case 1:
            r = q;
            g = brightness;
            b = p;
            break;
        case 2:
            r = p;
            g = brightness;
            b = t;
            break;
        case 3:
            r = p;
            g = q;
            b = brightness;
            break;
        case 4:
            r = t;
            g = p;
            b = brightness;
            break;
        default:
            r = brightness;
            g = p;
            b = q;
            break;
    }
    RGB out;
    out.r = r;
    out.g = g;
    out.b = b;
    return out;
}

int main()
{
    RGB rgb;
    HSB hsb;
    rgb.r = 255;
    rgb.g = 0;
    rgb.b = 0;
    hsb = rgb2hsb(rgb);
    printf("HSB: h = %.2f, s = %.2f, b = %.2f\n", hsb.h, hsb.s, hsb.b);
    hsb.h = 120;
    hsb.s = 1;
    hsb.b = 1;
    rgb = hsb2rgb(hsb);
    printf("RGB: r = %.2f, g = %.2f, b = %.2f\n", rgb.r, rgb.g, rgb.b);
    return 0;
}

这段代码中,我们定义了两个结构体,分别是RGB和HSB,用于存储颜色值。然后,我们实现了两个函数,分别是rgb2hsb和hsb2rgb,用于实现RGB到HSB的转换和HSB到RGB的转换。最后,我们在main函数中测试了这两个函数的正确性。

这段代码可以作为一个通用的RGB到HSB转换器,它可以在各种应用程序中使用,例如图像处理、图形用户界面、游戏开发等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

颜色空间系列1: RGBCIEXYZ颜色空间转换及相关优化

颜色空间系列代码下载链接:http://files.cnblogs.com/Imageshop/ImageInfo.rar (同文章同步更新) 在颜色感知研究,CIE 1931...David Wright (Wright 1928) John Guild (Guild 1931) 做一系列实验得出。...更过具体关于XYZ空间理论解释可见:点击打开链接 本文重点是如何优化这个RGBXYZ相互转换过程。...由以上数式可以看出RGBXYZ颜色空间转换时线性,因此,两个系数矩阵之间成绩必为一个E矩阵(对角线为1,其他元素都为0),读者可以用matlab测试下。...= 255; else if (Blue < 0) Blue = 0; 正如代码注释一样,XYZ-RGB转换必须判断转换颜色是否在有效范围内。

3.3K20
  • 颜色空间系列2: RGBCIELAB颜色空间转换优化算法

    关于CIELAB颜色空间更多原理说明,可见:http://en.wikipedia.org/wiki/Lab_color_space 本文研究重点是RGBLAB之间快速转换过程。...首先,RGBLAB之间没有直接转换公式,其必须用通道XYZ颜色空间作为中间层,关于RGBXYZ颜色空间转换优化,详见颜色空间系列1。...关于这样优化,OpenCv已经做了非常好工作,各位看客也可以先看看OpenCv代码,本文未直接沿用其优化,但本文算法更简单明了,在保证结果无明显变化同时,速度效率都有30%以上提升。...,可以看出,这个转换过程代码很简单,清晰,而且效率不菲,对一副4000*3000数码照片进行RGB->LAB,然后再LAB->RGB算法本体时间只有250ms。...同样道理,上述快速算法如果进行多次转换,必然也存在精度上损失。 LAB空间在以后肤色检测文章还会有提到。

    3.8K20

    颜色空间系列3: RGBYCbCr颜色空间转换优化算法

    RGB空间之间相互转换公式在网上也有多种,我们这里取http://en.wikipedia.org/wiki/YCbCr 描述JPG转换时使用计算公式:   JPEG conversion   ...要避免浮点运算带来速度瓶颈,这里同样可以用 颜色空间系列1: RGBCIEXYZ颜色空间转换及相关优化 文章同样优化技巧。...,因为这种比较简单代码,直接对表达式进行强制类型转换比用中间变量要少几条汇编码,并且中间变量越少,在编译后越有可能让CPU用寄存器来缓存一些变量,而不是用内存。...比如我们比较下注释部分上述代码反编译码: 注释掉部分反编译码: Y = (YCbCrYRI * Red + YCbCrYGI * Green + YCbCrYBI...在皮肤识别方面,常用YCbCr空间数据进行分析,从上面几个图中也可以看出 ,肤色在CbCr有着一定集聚性,这个在日后文章再说。

    1.8K30

    学会HSB色彩模式,让配色有理有据!

    RGB CMYK 两大色彩模式是最重要和最基础RGB 更是与我们工作密不可分。可是,在实际工作我们往往很少直接通过 RGB 模式进行调色。 ---- ????...HSB 色彩模式在项目中实际应用 1. 爆款、预约详情页色卡库 在去年 vivo 游戏中心爆款、预约详情页改版优化,都运用了 HSB 色彩模式。...重点分析 Developer 深色适配配色示例,通过将 Developer 给出深色模式适配示例色值转换HSB 之后,发现其 HSB 数值变化是有一定规律,规律基本符合: BUT:...在我寻找资料过程,也看到很多通过色相,饱和度,明度一致或者对比等方式得到协调优秀配色方法。这些都可以通过方法 HSB 模式结合,快速方便准确帮我们找到合适颜色。...△ 网络图片-色相环配色图 在日常设计,可以通过个人对色彩感知与把握选取一个颜色,再通过 HSB 快速选择相应色板,运用在页面配色

    1.6K30

    快速提取文档java,c代码

    快速提取文档java,c代码,自动过滤头文件 演示文稿: ---- 网页版: 体验地址:https://iu00.cn/info/extract.php 网页代码: 待转换代码: <form action="<?...} Python版: 只是将<em>代码</em>提取出来了,还是需要自己完善一下<em>的</em>,仅支持word文档,仅支持java语言 <em>代码</em><em>和</em>程序 程序下载:https://wwkm.lanzouf.com/iU6Kk0twjn1a...(解压后找到Main.exe运行即可) 程序<em>代码</em>: (py写<em>的</em>比较复杂,而且可能问题会比较多,不支持<em>c</em>,懒得改了) import PySimpleGUI as sg import docx2txt import...elif ';' in line: new_lines.append(line) # 处理类<em>和</em>方法<em>的</em>开始<em>和</em>结束括号 elif line.strip

    70020

    C++ 强制类型转换赋值类型转换

    强制类型转换C语言形式: (类型名)(表达式) 比如: (double)a //把a转换为double类型 (int)(a+b) //把a+b转换为整型 需要注意是:如果强制类型转换对象是一个变量...(int)(a+b) //把a+b转换为整型 (int)a+b //把a转换为整型,然后加b C++新增加形式: 类型名(表达式) 该形式类型名不需要括括号,但是待转换对象不管是变量还是表达式都需要用括号括起来...i = (int)x; cout<<"x = "<<x<<",i = "<<i<<endl; getchar(); return 0; } 运行结果: x = 3.6,i = 3 赋值过程<em>中</em><em>的</em>类型<em>转换</em>...字符型与数值型<em>的</em>说明: 在<em>C</em>++基本<em>的</em>数据类型<em>中</em>,可以分为四类:整型,浮点型,字符型,布尔型。其中数值型包括 整型与浮点型;字符型即为char。...或long型数据赋值给一个char型变量,只将低8位原封不动<em>的</em>送到char型变量<em>中</em>。

    1.6K10

    WPF 像素着色器进阶:使用 HLSL 编写一个高性能实时变化 HSLHSVHSB 调色盘

    关于 HSL HSV/HSB 更多资料,可以参考 HSL and HSV - Wikipedia ▲ HSL ▲ HSV HSL HSV/HSB HLSL 代码 版本一:初步实现 由于...HSL HSV/HSBRGB 转换是非常广泛被使用,所以网上代码非常丰富,我们只需要让 GPT-4 帮我们生成一个就可以了: 这是 HSL 调色盘代码: sampler2D input...(右、上等) 亮度或明度,当指定这个值时,整个调色盘最大亮度或明度就被限制到了这个值 通常,1 2 直接在代码设好就可以了,3 则通常是在界面额外显示一个滑块了整体调节。...所以,如果你希望上述像素着色器能够在这样情况下工作,则需要放弃 PS_3 转而使用 PS_2,或者在不满足要求情况下自己用其他方式进行软渲染。 那么,上述代码能将指令数优化到 64 以内吗?...既然 GPT-4 那么强大,那么就劳烦一下它吧,经过反复询问以及我调试下,HSL 调色盘 HSV/HSB 调色盘精简指令全功能版本就出来啦,代码如下,大家可复制参考。

    54010

    VB.NET 实现屏幕取色器20210924

    RGB相比最大不同是,RGB模式是发光色彩模式,你在一间黑暗房间内仍然可以看见萤幕上内容。  CMYK是一种依靠反光色彩模式,我们能阅读报纸内容是为什么呢?...HSL是一种将RGB色彩模型点在圆柱坐标系表示法。这两种表示法试图做到比基于笛卡尔坐标系几何结构RGB更加直观。是目前运用最广颜色系统之一。  ...这个模型颜色参数分别是:色调(H),饱和度(S),明度(V)。 三,再简单了解一下,各颜色模式之间转换公式VB代码吧!...(Y)黑色(K)计算得出: B = 255×(1- Y)×(1- K) 3.3.HSL/HSBRGB模式公式 当0≤ ħ <360,0≤小号≤10≤大号≤1: C =(1-| 2L-1 |)×...各个颜色模式转换代码(可能会有错误,如有发现请后台告知,万分感谢) 4.1.颜色转换帮助类(写得不好,仅供参考;引用转载请注明出处!)

    2K80

    C#类型转换-自定义隐式转换显式转换

    基础知识 类型转换有2种:隐式转换显式转换。但是,不管是隐式转换,还是显式转换,都是生成了一个新对象返回。改变新对象属性,不会影响老对象!...参数为原始类型,方法名为目标类型 类A到类B类型转换定义不能在类C中进行(即2个类转换不能在第3个类定义),否则会报错:用户定义转换必须是转换成封闭类型,或者从封闭类型转换。...Overriding implicit operators in C# 示例代码 //================定义类型方法================ class Robot {...是因为有这个限制:类A到类B类型转换定义不能在类C中进行(即2个类转换不能在第3个类定义) 所以对于目标类型是集合类List,我们无法直接定义到它转换。...上面实际应用代码就是这样做:class Element : List> 创建T1到T2自定义转换,使用时逐个转换:list.Select(p=>(B)p).ToList()

    2.3K30

    如何用 Python 给照片换色

    HSB RGB 转换 HSB RGB 都能表示一个颜色,它们之间也是可以相互转换,可以一一对应。 他们之间转换逻辑这里就不再专门对其公式展开详解了,公式总结如下: ?...我们可以直接调用,比如 Python colorsys 模块,就实现了 rgb_to_hsv hsv_to_rgb 算法,我们也可以直接使用。...色调转换 了解了以上内容之后,我们就可以使用程序来实现色调转换了。相比我们已经知道应该改什么内容了,那就是修改 HSV H 值,通过不同 H 值我们就可以将图片转换为不同色调了。...所以最后输出效果就是如下结果: ? 如果将代码 target_hue 值进行更改,就会呈现不同颜色风格了,就像文中开头所示一样。...所以使用 RGBA HSV 转换我们就可以实现透明像素处理了,代码实现如下: import colorsys from PIL import Image # 输入文件 filename = '

    1.7K10

    快速了解Pythonfor循环(语法代码示例)

    之前讲过在Python循环分为两大类,一类是while循环另一类是for循环,不管是什么循环它作用是控制代码重复执行。...一、语法: for 临时变量 in 序列: 重复执行代码1 重复执行代码2     ...... 临时变量:程序员自己自定义 序列:所谓序列一般指的是数据序列。...直白理解数据序列:如果一个数据内部如果由多个数据组成那么这样数据我们叫做序列。 二、快速体验: 执行结果: 图片1.png 以上结果很显然是把字符串每一个字符都循环输出了一遍。...下一篇文章我们再来看看怎么利用breakcontinue退出for循环。...Python基础教程各大网站上就有很多,当然不管你学习到了哪里大都是从基础过来,所以在学习基础时候不要偷懒,一定要搞定语法原理步骤。

    68720

    骚操作,如何用 Python 给照片换色

    HSB RGB 转换 HSB RGB 都能表示一个颜色,它们之间也是可以相互转换,可以一一对应。 他们之间转换逻辑这里就不再专门对其公式展开详解了,公式总结如下: ?...我们可以直接调用,比如 Python colorsys 模块,就实现了 rgb_to_hsv hsv_to_rgb 算法,我们也可以直接使用。...色调转换 了解了以上内容之后,我们就可以使用程序来实现色调转换了。相比我们已经知道应该改什么内容了,那就是修改 HSV H 值,通过不同 H 值我们就可以将图片转换为不同色调了。...所以最后输出效果就是如下结果: ? 如果将代码 target_hue 值进行更改,就会呈现不同颜色风格了,就像文中开头所示一样。...所以使用 RGBA HSV 转换我们就可以实现透明像素处理了,代码实现如下: import colorsys from PIL import Image # 输入文件 filename = '

    1.4K20

    如何用 Python 给照片换色

    HSB RGB 转换 HSB RGB 都能表示一个颜色,它们之间也是可以相互转换,可以一一对应。 他们之间转换逻辑这里就不再专门对其公式展开详解了,公式总结如下: ?...我们可以直接调用,比如 Python colorsys 模块,就实现了 rgb_to_hsv hsv_to_rgb 算法,我们也可以直接使用。...色调转换 了解了以上内容之后,我们就可以使用程序来实现色调转换了。相比我们已经知道应该改什么内容了,那就是修改 HSV H 值,通过不同 H 值我们就可以将图片转换为不同色调了。...所以最后输出效果就是如下结果: ? 如果将代码 target_hue 值进行更改,就会呈现不同颜色风格了,就像文中开头所示一样。...所以使用 RGBA HSV 转换我们就可以实现透明像素处理了,代码实现如下: import colorsysfrom PIL import Image # 输入文件filename = 'input.png

    1.2K20

    色彩空间RGBCMYKHSLHSBHSVLabYUV基础理论及转换方法:RGB与YUV

    基于RGB改进HSL/HSV色彩模型 HSL 模式HSB(HSV) 都是基于 RGB ,是作为一个更方便友好方法创建出来。...HSBHSV是是一样,只是叫法不一样而已 HSL:色相H(Hue) ,饱和度S(Saturation),亮度L(Lightness) HSB:色相H(Hue) ,饱和度S(Saturation),明度...其实,我们生活中所说颜色光谱可见光颜色并不是严格对等。...提出者以alpha来命名是源于经典线性插值方程αA + (1-α)B所用就是这个希腊字母。PNG是一种使用RGBA图像格式。 注:一般两个色彩空间,找一个变换矩阵,可以快速转换。...原文链接:色彩空间RGB/CMYK/HSL/HSB/HSV/Lab/YUV基础理论及转换方法:RGB与YUV - 计算机视觉与计算机图形学图像处理所涉及基础理论知识 - 周陆军个人网站,原文阅读体验可能更好

    3.5K00

    如何用 Python 给照片换色

    HSB RGB 转换 HSB RGB 都能表示一个颜色,它们之间也是可以相互转换,可以一一对应。 他们之间转换逻辑这里就不再专门对其公式展开详解了,公式总结如下: ?...我们可以直接调用,比如 Python colorsys 模块,就实现了 rgb_to_hsv hsv_to_rgb 算法,我们也可以直接使用。...色调转换 了解了以上内容之后,我们就可以使用程序来实现色调转换了。相比我们已经知道应该改什么内容了,那就是修改 HSV H 值,通过不同 H 值我们就可以将图片转换为不同色调了。...所以最后输出效果就是如下结果: ? 如果将代码 target_hue 值进行更改,就会呈现不同颜色风格了,就像文中开头所示一样。...所以使用 RGBA HSV 转换我们就可以实现透明像素处理了,代码实现如下: import colorsysfrom PIL import Image # 输入文件filename = 'input.png

    1.4K10

    如何用 Python 给照片换色

    HSB RGB 转换 HSB RGB 都能表示一个颜色,它们之间也是可以相互转换,可以一一对应。 他们之间转换逻辑这里就不再专门对其公式展开详解了,公式总结如下: ?...我们可以直接调用,比如 Python colorsys 模块,就实现了 rgb_to_hsv hsv_to_rgb 算法,我们也可以直接使用。...色调转换 了解了以上内容之后,我们就可以使用程序来实现色调转换了。相比我们已经知道应该改什么内容了,那就是修改 HSV H 值,通过不同 H 值我们就可以将图片转换为不同色调了。...所以最后输出效果就是如下结果: ? 如果将代码 target_hue 值进行更改,就会呈现不同颜色风格了,就像文中开头所示一样。...所以使用 RGBA HSV 转换我们就可以实现透明像素处理了,代码实现如下: import colorsysfrom PIL import Image # 输入文件filename = 'input.png

    3.3K30

    UI界面配色方法终极指南!一篇长文搞定所有问题

    在数字产品设计,您需要帮助用户根据优先级快速采取行动,您需要非常小心地使用颜色。让我们找出它有什么属性可以很好地处理颜色之“火”。 颜色属性 要知道颜色是如何工作,我们需要知道它们有什么属性。...在数码产品,颜色主要是RGB、HSL、HSB等,工作时主要使用HEXRGB。 RGBA(红、绿、蓝、透明度):这是一种通过将光红、绿、蓝三基色与表示透明度相结合来表现各种颜色基本方法。...HEX:从RGB转换为十六进制代码,与其他元素相比具有可以一次复制粘贴优点,是一种通用颜色值,在各种环境中都易于输入。 所有程序都使用 HSB 来选择颜色并使用 Hex 显示它们。...当您想使颜色变暗时,在设计时要方便得多,因为当您看到 HSB 情况时,HSB 可以更直观地处理颜色属性,您可以减少 B 而不是通过混合红色、绿色蓝色来变暗 RGBA。...我用illustrator调整了HSBHue并分配了12种颜色。我照原样复制它,然后将其转换为黑白。黄色蓝色是生成,但其余颜色看起来不是很规则。为什么 180 度 300 度颜色更亮?

    2.4K20
    领券