C# HSL 转RGB 和RGB 转HSL |
您所在的位置:网站首页 › hsb转rgb算法 › C# HSL 转RGB 和RGB 转HSL |
最近在做图像相关的一些东西,但是由于之前没有接触过,比如图像的灰度,图像的亮度等等概念都不清楚, 故而有需求需要HSL转RGB 和RGB转HSL 特地百度和必应了一番,搜索了一些资料。简单的做一下记录,便于以后翻阅 首先要了解HSL,具体HSL模型请百度,这里不再做具体的介绍,本文只做一个简单的介绍 //C# HSL转RGB public Color HslToRgb(double Hue, double Saturation, double Lightness) { if (Hue < 0) Hue = 0.0; if (Saturation < 0) Saturation = 0.0; if (Lightness < 0) Lightness = 0.0; if (Hue >= 360) Hue = 359.0; if (Saturation > 255) Saturation = 255; if (Lightness > 255) Lightness = 255; Saturation = Saturation / 255.0; Lightness = Lightness / 255.0; double C = (1 - Math.Abs(2 * Lightness - 1)) * Saturation; double hh = Hue / 60.0; double X = C * (1 - Math.Abs(hh % 2 - 1)); double r = 0, g = 0, b = 0; if (hh >= 0 && hh < 1) { r = C; g = X; } else if (hh >= 1 && hh < 2) { r = X; g = C; } else if (hh >= 2 && hh < 3) { g = C; b = X; } else if (hh >= 3 && hh < 4) { g = X; b = C; } else if (hh >= 4 && hh < 5) { r = X; b = C; } else { r = C; b = X; } double m = Lightness - C / 2; r += m; g += m; b += m; r = r * 255.0; g = g * 255.0; b = b * 255.0; r = Math.Round(r); g = Math.Round(g); b = Math.Round(b); return System.Drawing.Color.FromArgb((int)r, (int)g, (int)b); } //C# RGB转HSL public void RGBToHSL(Color AColor, ref double H, ref double S, ref double L) { double r = AColor.R; double g = AColor.G; double b = AColor.B; if (r < 0) r = 0; if (g < 0) g = 0; if (b < 0) b = 0; if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; r = r / 255; g = g / 255; b = b / 255; double M = Math.Max(Math.Max(r, g), b); double m = Math.Min(Math.Min(r, g), b); double d = M - m; if (d == 0) H = 0; else if (M == r) H = ((g - b) / d) % 6; else if (M == g) H = (b - r) / d + 2; else H = (r - g) / d + 4; H *= 60; if (H < 0) H += 360; L = (M + m) / 2; if (d == 0) S = 0; else S = d / (1 - Math.Abs(2 * L - 1)); //如果放大或者缩小 乘以或者除以相应的倍数 S = S * 255; L = L * 255; //document.calcform.h.value = h.toFixed(0); //document.calcform.s.value = s.toFixed(1); //document.calcform.l.value = l.toFixed(1); //四舍五入的位数 //document.calcform.color.style.backgroundColor = '#' + hex; } Bitmap bm = new Bitmap(strSourcePath); int nWidth = bm.Width; int nHeight = bm.Height; System.Drawing.Color cl; int nA,nR, nG, nB; double dH = 0, dS = 0, dL = 0; for (int x = 0; x < nWidth; x++) { for (int y = 0; y < nHeight; y++) { cl = bm.GetPixel(x, y); nA = cl.A; nR = cl.R; nG = cl.G; nB = cl.B; RGBToHSL(System.Drawing.Color.FromArgb(nA, nR, nG,nB), ref dH, ref dS, ref dL); dL = dirNew[Convert.ToInt32(dL)]; cl = HslToRgb(dH, dS, dL); ; bm.SetPixel(x, y, cl); } } bm.Save(strDesPath); bm.Dispose(); |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |