RGB、HSV、HSL颜色模型的含义本文就不赘述了,大家可以直接百度到。

在此提供一个封装好的可以对三种颜色模型进行互相转换的辅助类。

以上是使用该类写出的程序示例。

以下是颜色模型类的描述

#region RGB / HSV / HSL 颜色模型类/// <summary>/// 类      名:ColorHSL/// 功      能:H 色相 \ S 饱和度(纯度) \ L 亮度 颜色模型 /// 日      期:2015-02-08/// 修      改:2015-03-20/// 作      者:ls9512/// </summary>public class ColorHSL{public ColorHSL(int h, int s, int l){this._h = h;this._s = s;this._l = l;}private int _h;private int _s;private int _l;/// <summary>/// 色相/// </summary>public int H{get { return this._h; }set{this._h = value;this._h = this._h > 360 ? 360 : this._h;this._h = this._h < 0 ? 0 : this._h;}}/// <summary>/// 饱和度(纯度)/// </summary>public int S{get { return this._s; }set{this._s = value;this._s = this._s > 255 ? 255 : this._s;this._s = this._s < 0 ? 0 : this._s;}}/// <summary>/// 饱和度/// </summary>public int L{get { return this._l; }set{this._l = value;this._l = this._l > 255 ? 255 : this._l;this._l = this._l < 0 ? 0 : this._l;}}}/// <summary>/// 类      名:ColorHSV/// 功      能:H 色相 \ S 饱和度(纯度) \ V 明度 颜色模型 /// 日      期:2015-01-22/// 修      改:2015-03-20/// 作      者:ls9512/// </summary>public class ColorHSV{/// <summary>/// 构造方法/// </summary>/// <param name="h"></param>/// <param name="s"></param>/// <param name="v"></param>public ColorHSV(int h, int s, int v){this._h = h;this._s = s;this._v = v;}private int _h;private int _s;private int _v;/// <summary>/// 色相/// </summary>public int H{get { return this._h; }set{this._h = value;this._h = this._h > 360 ? 360 : this._h;this._h = this._h < 0 ? 0 : this._h;}}/// <summary>/// 饱和度(纯度)/// </summary>public int S{get { return this._s; }set{this._s = value;this._s = this._s > 255 ? 255 : this._s;this._s = this._s < 0 ? 0 : this._s;}}/// <summary>/// 明度/// </summary>public int V{get { return this._v; }set{this._v = value;this._v = this._v > 255 ? 255 : this._v;this._v = this._v < 0 ? 0 : this._v;}}}/// <summary>/// 类      名:ColorRGB/// 功      能:R 红色 \ G 绿色 \ B 蓝色 颜色模型///                 所有颜色模型的基类,RGB是用于输出到屏幕的颜色模式,所以所有模型都将转换成RGB输出/// 日      期:2015-01-22/// 修      改:2015-03-20/// 作      者:ls9512/// </summary>public class ColorRGB{/// <summary>/// 构造方法/// </summary>/// <param name="r"></param>/// <param name="g"></param>/// <param name="b"></param>public ColorRGB(int r, int g, int b){this._r = r;this._g = g;this._b = b;}private int _r;private int _g;private int _b;/// <summary>/// 红色/// </summary>public int R{get { return this._r; }set{this._r = value;this._r = this._r > 255 ? 255 : this._r;this._r = this._r < 0 ? 0 : this._r;}}/// <summary>/// 绿色/// </summary>public int G{get { return this._g; }set{this._g = value;this._g = this._g > 255 ? 255 : this._g;this._g = this._g < 0 ? 0 : this._g;}}/// <summary>/// 蓝色/// </summary>public int B{get { return this._b; }set{this._b = value;this._b = this._b > 255 ? 255 : this._b;this._b = this._b < 0 ? 0 : this._b;}}/// <summary>/// 获取实际颜色/// </summary>/// <returns></returns>public Color GetColor(){return Color.FromArgb(this._r, this._g, this._b);}} #endregion

以下是实现颜色模型之间互相转换的类

/// <summary>/// 类      名:ColorHelper/// 功      能:提供从RGB到HSV/HSL色彩空间的相互转换/// 日      期:2015-02-08/// 修      改:2015-03-20/// 作      者:ls9512/// </summary>public static class ColorHelper{/// <summary>/// RGB转换HSV/// </summary>/// <param name="rgb"></param>/// <returns></returns>public static ColorHSV RgbToHsv(ColorRGB rgb){float min, max, tmp, H, S, V;float R = rgb.R * 1.0f / 255, G = rgb.G * 1.0f / 255, B = rgb.B * 1.0f / 255;tmp = Math.Min(R, G);min = Math.Min(tmp, B);tmp = Math.Max(R, G);max = Math.Max(tmp, B);// HH = 0;if (max == min){H = 0;}else if (max == R && G > B){H = 60 * (G - B) * 1.0f / (max - min) + 0;}else if (max == R && G < B){H = 60 * (G - B) * 1.0f / (max - min) + 360;}else if (max == G){H = H = 60 * (B - R) * 1.0f / (max - min) + 120;}else if (max == B){H = H = 60 * (R - G) * 1.0f / (max - min) + 240;}// Sif (max == 0){S = 0;}else{S = (max - min) * 1.0f / max;}// VV = max;return new ColorHSV((int)H, (int)(S * 255), (int)(V * 255));}/// <summary>/// HSV转换RGB/// </summary>/// <param name="hsv"></param>/// <returns></returns>public static ColorRGB HsvToRgb(ColorHSV hsv){if (hsv.H == 360) hsv.H = 359; // 360为全黑,原因不明float R = 0f, G = 0f, B = 0f;if (hsv.S == 0){return new ColorRGB(hsv.V, hsv.V, hsv.V);}float S = hsv.S * 1.0f / 255, V = hsv.V * 1.0f / 255;int H1 = (int)(hsv.H * 1.0f / 60), H = hsv.H;float F = H * 1.0f / 60 - H1;float P = V * (1.0f - S);float Q = V * (1.0f - F * S);float T = V * (1.0f - (1.0f - F) * S);switch (H1){case 0: R = V; G = T; B = P; break;case 1: R = Q; G = V; B = P; break;case 2: R = P; G = V; B = T; break;case 3: R = P; G = Q; B = V; break;case 4: R = T; G = P; B = V; break;case 5: R = V; G = P; B = Q; break;}R = R * 255;G = G * 255;B = B * 255;while (R > 255) R -= 255;while (R < 0) R += 255;while (G > 255) G -= 255;while (G < 0) G += 255;while (B > 255) B -= 255;while (B < 0) B += 255;return new ColorRGB((int)R, (int)G, (int)B);}/// <summary>/// RGB转换HSL/// </summary>/// <param name="rgb"></param>/// <returns></returns>public static ColorHSL RgbToHsl(ColorRGB rgb){float min, max, tmp, H, S, L;float R = rgb.R * 1.0f / 255, G = rgb.G * 1.0f / 255, B = rgb.B * 1.0f / 255;tmp = Math.Min(R, G);min = Math.Min(tmp, B);tmp = Math.Max(R, G);max = Math.Max(tmp, B);// HH = 0;if (max == min){H = 0;  // 此时H应为未定义,通常写为0}else if (max == R && G > B){H = 60 * (G - B) * 1.0f / (max - min) + 0;}else if (max == R && G < B){H = 60 * (G - B) * 1.0f / (max - min) + 360;}else if (max == G){H = H = 60 * (B - R) * 1.0f / (max - min) + 120;}else if (max == B){H = H = 60 * (R - G) * 1.0f / (max - min) + 240;}// L L = 0.5f * (max + min);// SS = 0;if (L == 0 || max == min){S = 0;}else if (0 < L && L < 0.5){S = (max - min) / (L * 2);}else if (L > 0.5){S = (max - min) / (2 - 2 * L);}return new ColorHSL((int)H, (int)(S * 255), (int)(L * 255));}/// <summary>/// HSL转换RGB/// </summary>/// <param name="hsl"></param>/// <returns></returns>public static ColorRGB HslToRgb(ColorHSL hsl){float R = 0f, G = 0f, B = 0f;float S = hsl.S * 1.0f / 255, L = hsl.L * 1.0f / 255;float temp1, temp2, temp3;if (S == 0f) // 灰色{R = L;G = L;B = L;}else{if (L < 0.5f){temp2 = L * (1.0f + S);}else{temp2 = L + S - L * S;}temp1 = 2.0f * L - temp2;float H = hsl.H * 1.0f / 360;// Rtemp3 = H + 1.0f / 3.0f;if (temp3 < 0) temp3 += 1.0f;if (temp3 > 1) temp3 -= 1.0f;R = temp3;// Gtemp3 = H;if (temp3 < 0) temp3 += 1.0f;if (temp3 > 1) temp3 -= 1.0f;G = temp3;// Btemp3 = H - 1.0f / 3.0f;if (temp3 < 0) temp3 += 1.0f;if (temp3 > 1) temp3 -= 1.0f;B = temp3;}R = R * 255;G = G * 255;B = B * 255;return new ColorRGB((int)R, (int)G, (int)B);}}

【C# / Algorithm】RGB、HSV、HSL颜色模型的互相转换相关推荐

  1. 【3000字扫盲】来搞“颜色“!RGB/HSV/HSI颜色模型

    一:RGB三原色 RGB三原色是怎么来的呢? 当然,是因为他们三者可以调配出其他所有颜色.但为什么偏偏是这三个颜色呢? 人眼有四种感光细胞,分别是三种锥状感光细胞,分别感知红,绿,蓝三色,以及感知黑白 ...

  2. [Python模块学习]用colorsys模块转换颜色模型,常见颜色模型简介(RGB/HSV/HSL/YIQ)

    colorsys模块 博主最近又进入了无聊模式,没事就翻Python标准库读源码读着玩.但是里面有几个模块确实规模比较大,所以坑挖了一半就停了-现在电脑桌面上一堆没填完的坑.总之慢慢填吧- 今天发现了 ...

  3. RGB生成颜色c语言,C++实现RGB和HSL颜色转换代码

    #include "stdafx.h" #define min3v(v1, v2, v3) ((v1)>(v2)? ((v2)>(v3)?(v3):(v2)):((v1 ...

  4. Hex hsl 转换 php,HEX和RGB和HSL颜色数值在线转换工具

    JavaScript 语言: JaveScriptBabelCoffeeScript 确定 //http://stackoverflow.com/questions/2353211/hsl-to-rg ...

  5. matlab rgb2ntsc函数,matlab 颜色模型之间的转换

    hsv2rgb        HSV模型转换为RGB模型 ntsc2rgb       NTSC模型转换为RGB模型 rgb2hsv         RGB模型转换为HSV模型 rgb2ntsc    ...

  6. HSI、HSV、RGB、CMY、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV等颜色模型简介

    基本概念 所谓颜色模型就是指某个三维颜色空间中的一个可见光子集,它包含某个颜色域的所有颜色.例如,RGB颜色模型就是三维直角坐标颜色系统的一个单位正方体.颜色模型的用途是在某个颜色域内方便的指定颜色, ...

  7. 几种颜色模型(颜色空间):HSV CMYK RGB

    RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的. HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. ...

  8. 计算机视觉的那些事——HSV颜色模型

    HSV颜色模型 HSV(Hue, Saturation,Value)根据颜色直观特性创建的一种颜色空间,也称六角锥体模型(Hexcone Model),参数分别为色调(H),饱和度(S),明度(V). ...

  9. Android上基于HSV颜色模型实现取色盘功能

    HSV色彩空间 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model).这个 ...

最新文章

  1. Debian Linux下安装配置 Pure-ftpd
  2. Oracle的sys_connect_by_path函数
  3. 中psr_典型电路—电容10UF 和0.1UF并联使用的技巧常见于电源电路中,你知道其中的原理吗?...
  4. linux中cd命令及范例,15个Linux中的“cd”命令的实际示例
  5. TensorFlow Lite学习笔记
  6. Spring框架学习笔记04:初探Spring——采用Java配置类管理Bean
  7. c语言怎么储存字母,c语言怎么用变量存储中文字符?书本上面没有的秘密
  8. 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分
  9. Android中多次点击开发者模式的实现
  10. android studio官方教程 pdf,android studio教程pdf
  11. 巧妙使用css美化网页
  12. CRC校验原理及CRC-8简单校验函数设计
  13. STM32-esp8266-MQTT服务器通信
  14. [转载]从春招到秋招,一个本科生的求职之路。
  15. 如何成为一名好的程序员
  16. python常见加密方法实现,DES,AES,RSA,MD5,国密。--更新中
  17. 百度对抗高德 移动导航app进入免费时代
  18. 走进音视频的世界——杜比视界Dolby Vision与HDR
  19. 424、电梯监控无线桥解决方案及注意事项
  20. Android studio不停indexing解决

热门文章

  1. 2014年总结--不再年少
  2. 微信小程序icon图标自适应大小,最新篇
  3. go time format
  4. Golang常用库学习
  5. 骁龙805支持4K显示 内存带宽翻倍是亮点
  6. 微信小程序周报(第七期)
  7. 跟我一起使用 compose 做一个跨平台的黑白棋游戏(4)移植到compose-jb实现跨平台
  8. 十二、tars 服务,java tars服务client端
  9. 七夕哄女朋友神器——送她一束玫瑰花
  10. JZOJ5945. 【NOIP2018模拟11.02】昆特牌(gwent)