【C#】RGB,CMYK,HSB各种颜色表示的转换

 

一、表示颜色的方式有很多种,如RGB,CMYK,HSB,Hex等等

  1、RGB:这种表示颜色由三原色构成,通过红,绿,蓝三种颜色分量的不同,组合成不同的颜色,例如,100%红+100%绿混合可以得到黄色,红绿蓝三种颜色叠加可以得到白色,基本上屏幕显示色彩都采用这种方式

  2、CMYK:也称作印刷色彩模式,是一种依靠反光的色彩模式,主要用于印刷,和RGB类似,CMY是3种印刷油墨名称的首字母:青色Cyan、品红色Magenta、黄色Yellow。而K取的是black最后一个字母,之所以不取首字母,是为了避免与蓝色(Blue)混淆。从理论上来说,只需要CMY三种油墨就足够了,它们三个加在一起就应该得到黑色。但是由于目前制造工艺还不能造出高纯度的油墨,CMY相加的结果实际是一种暗红色。

  3、HSB:通过色相(hues),饱和度(saturation),亮度(brightness)来表示颜色

二、下面说说关于各种颜色之间的转换

  1、RGB与CMYK之间的转换

        public static void RGB2CMYK(int red, int green, int blue, out double c, out double m, out double y, out double k)
{
c = (double)(255 - red) / 255;
m = (double)(255 - green) / 255;
y = (double)(255 - blue) / 255; k = (double)Math.Min(c, Math.Min(m, y));
if (k == 1.0)
{
c = m = y = 0;
}
else
{
c = (c - k) / (1 - k);
m = (m - k) / (1 - k);
y = (y - k) / (1 - k);
}
}
public static void CMYK2RGB(double c, double m, double y, double k, out int r, out int g, out int b)
{
r = Convert.ToInt32((1.0 - c) * (1.0 - k) * 255.0);
g = Convert.ToInt32((1.0 - m) * (1.0 - k) * 255.0);
b = Convert.ToInt32((1.0 - y) * (1.0 - k) * 255.0);
}

  2、RGB与HSB之间的转换

        public static void RGB2HSB(int red, int green, int blue, out double hue, out double sat, out double bri)
{
double r = ((double)red / 255.0);
double g = ((double)green / 255.0);
double b = ((double)blue / 255.0); double max = Math.Max(r, Math.Max(g, b));
double min = Math.Min(r, Math.Min(g, b)); hue = 0.0;
if (max == r && g >= b)
{
if (max - min == 0) hue = 0.0;
else hue = 60 * (g - b) / (max - min);
}
else if (max == r && g < b)
{
hue = 60 * (g - b) / (max - min) + 360;
}
else if (max == g)
{
hue = 60 * (b - r) / (max - min) + 120;
}
else if (max == b)
{
hue = 60 * (r - g) / (max - min) + 240;
} sat = (max == 0) ? 0.0 : (1.0 - ((double)min / (double)max));
bri = max;
}
public static void HSB2RGB(double hue, double sat, double bri, out int red, out int green ,out int blue)
{
double r = 0;
double g = 0;
double b = 0; if (sat == 0)
{
r = g = b = bri;
}
else
{
// the color wheel consists of 6 sectors. Figure out which sector you're in.
double sectorPos = hue / 60.0;
int sectorNumber = (int)(Math.Floor(sectorPos));
// get the fractional part of the sector
double fractionalSector = sectorPos - sectorNumber; // calculate values for the three axes of the color.
double p = bri * (1.0 - sat);
double q = bri * (1.0 - (sat * fractionalSector));
double t = bri * (1.0 - (sat * (1 - fractionalSector))); // assign the fractional colors to r, g, and b based on the sector the angle is in.
switch (sectorNumber)
{
case 0:
r = bri;
g = t;
b = p;
break;
case 1:
r = q;
g = bri;
b = p;
break;
case 2:
r = p;
g = bri;
b = t;
break;
case 3:
r = p;
g = q;
b = bri;
break;
case 4:
r = t;
g = p;
b = bri;
break;
case 5:
r = bri;
g = p;
b = q;
break;
}
}
red = Convert.ToInt32(r * 255);
green = Convert.ToInt32(g * 255);
blue = Convert.ToInt32(b * 255); ;
}

  3、RGB与十六进制Hex表示的转换

        public static string RGB2Hex(int r, int g, int b)
{
return String.Format("#{0:x2}{1:x2}{2:x2}", (int)r, (int)g, (int)b);
}
public static Color Hex2Color(string hexColor)
{
string r, g, b; if (hexColor != String.Empty)
{
hexColor = hexColor.Trim();
if (hexColor[0] == '#') hexColor = hexColor.Substring(1, hexColor.Length - 1); r = hexColor.Substring(0, 2);
g = hexColor.Substring(2, 2);
b = hexColor.Substring(4, 2); r = Convert.ToString(16 * GetIntFromHex(r.Substring(0, 1)) + GetIntFromHex(r.Substring(1, 1)));
g = Convert.ToString(16 * GetIntFromHex(g.Substring(0, 1)) + GetIntFromHex(g.Substring(1, 1)));
b = Convert.ToString(16 * GetIntFromHex(b.Substring(0, 1)) + GetIntFromHex(b.Substring(1, 1))); return Color.FromArgb(Convert.ToInt32(r), Convert.ToInt32(g), Convert.ToInt32(b));
} return Color.Empty;
}
private static int GetIntFromHex(string strHex)
{
switch (strHex)
{
case ("A"):
{
return 10;
}
case ("B"):
{
return 11;
}
case ("C"):
{
return 12;
}
case ("D"):
{
return 13;
}
case ("E"):
{
return 14;
}
case ("F"):
{
return 15;
}
default:
{
return int.Parse(strHex);
}
}
}

转换算法摘自:http://www.codeproject.com/Articles/19045/Manipulating-colors-in-NET-Part-1

【C#】RGB,CMYK,HSB各种颜色表示的转换(转)的更多相关文章

  1. RGB,CMYK,HSB各种颜色表示的转换 C#语言

    Introduction Why an article on "colors"? It's the same question I asked myself before writ ...

  2. 色彩空间RGB/CMYK/HSL/HSB/HSV/Lab/YUV基础理论及转换方法:RGB与YUV

    之前做个设计,现在从事IT,脑子里面关于RGB,RGBA,CMY,CMYK,YUV,但是具体理论还是不扎实.若干年前之前写过<水煮RGB与CMYK色彩模型—色彩与光学相关物理理论浅叙>&l ...

  3. c# 颜色RGB到HSB互相转换

    /// <summary> /// 色相,饱和度,亮度转换成rgb值 /// </summary> /// <returns></returns> pu ...

  4. 颜色空间模型(HSV\LAB\RGB\CMYK)

    通过Photoshop的拾色器,我们知道表征颜色的模型的不止一种,本文将系统并且详细讨论这四种模型(HSV.LAB.RGB和CMYK)之间的联系以及应用.本文部分章节整合了多位优秀博主的博客(链接见本 ...

  5. C# RGB和HSB相互转换

    背景 最近做的项目中有这样一个场景,设置任意一种颜色,得到这种颜色偏深和偏浅的两种颜色.也就是说取该颜色同色系的深浅两种颜色.首先想到的是调节透明度,但效果不理想.后来尝试调节颜色亮度,发现这才是正解 ...

  6. RGB和HSB的转换推算

    RGB三原色是基于人肉眼对光线的生理作用.人眼内有三种椎状体“对这三种光线频率所能感受的带宽最大,也能独立刺激这三种颜色的受光体”,因此RGB称为三原色.比如,黄色波长的光对人眼的刺激效果,和红色与绿 ...

  7. RGB与HSB之间的转换公式

    先来了解一些概念: 1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为: 2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色 ...

  8. RGB与HSB之间转换

    先来了解一些概念: 1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为: 2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色 ...

  9. 常用icon以及color颜色RGB值和对应颜色效果图

    Android谷歌官方扁平化设计常用icon集合   Android谷歌官方扁平化设计color颜色RGB值和对应颜色效果图.

随机推荐

  1. 【数学 裴蜀定理】bzoj2257: [Jsoi2009]瓶子和燃料

    使gcd最大的trick Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy的飞船上共有 N ...

  2. 计算机/ARM 系统

    这方面知识,自己有了大概了解,可以再没有重要急需学习的安排时,不时的翻翻这方面的书.本能力属于重要但不急需的能力

  3. Ubuntu 清理卸载残留文件

    dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

  4. Knockout v3.4.0 中文版教程-12-控制文本内容和外观-html绑定

    3. html绑定 目的 html绑定会使关联的DOM元素显示你参数指定的html内容. 当你的视图模型里面的值是HTML标记字符串,而你想要呈现它,这时候用html绑定特别合适. 例子 <di ...

  5. Core Animation 动画

    Core Animation框架 Core Animation可以作用与动画视图或者其他可视元素,为你完成了动画所需的大部分绘帧工作.你只需要配置少量的动画参数(如开始点的位置和结束点的位置)即可使用 ...

  6. deine const 等关键字区别

    define 属于预编译指令,在程序运行之前就已经编译好:额,定义变量,没有类型信息, const 修饰的变量是不可变的,只是给出了内存地址,且只在程序运行时初始化开辟一块内存空间 const 只修饰 ...

  7. 九度oj 题目1491:求1和2的个数

    题目描述: 给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,10序列中1和2的个数之和为3,因此F(10)=3.输入N,求F(N)的值,1 ...

  8. BZOJ 1226 [SDOI2009]学校食堂Dining ——状压DP

    看到B<=8,直接状态压缩即可. dp[i][j][k]表示当前相对位置是关于i的,并且i以前的已经就餐完毕,j表示i和之后的就餐情况,k表示上一个就餐的人的相对位置. 然后Dp即可 #incl ...

  9. 625. Minimum Factorization

    Problem statement Given a positive integer a, find the smallest positive integer b whose multiplicat ...

  10. Centos 安装Python3的方法

    由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到. [root@VM_105_217_centos Python-3.6.2]# ...