当前位置: 代码迷 >> C# >> 【C#】RGB,CMYK,HSB各种色彩表示的转换(转)
  详细解决方案

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

热度:654   发布时间:2016-04-28 08:34:34.0
【C#】RGB,CMYK,HSB各种颜色表示的转换(转)

【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