internal static Hsl ToColor(Rgb rgb) { Color color = System.Drawing.Color.FromArgb(rgb.R, rgb.G, rgb.B); float hue = color.GetHue(); float saturation = color.GetSaturation(); float lightness = color.GetBrightness(); Hsl hsl = new Hsl(); hsl.H = (int)hue; hsl.S = (int)(saturation * 100); hsl.L = (int)(lightness * 100); return(hsl); }
public PCCSTable() { try { string text = DependencyService.Get <IData>().GetData("PCCSAll.dat"); string[] line = text.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); if (line.Length > 0) { int count = 0; IList <PCCSDat> list = new List <PCCSDat>(); foreach (string str in line) { if (count == 0) { count++; continue; } // 1行目処理しない string[] part = str.Split(new char[] { ',', ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); if (part.Length > 0) { PCCSDat data = new PCCSDat(); data.Tone = part[0].ToString(); Rgb rgb = new Rgb(); rgb.R = System.Convert.ToInt16(part[1]); rgb.G = System.Convert.ToInt16(part[2]); rgb.B = System.Convert.ToInt16(part[3]); data.Rgb = rgb; Lch lch = new Lch(); lch = LchConverter.ToColor(rgb); data.Lch = lch; list.Add(data); } } items = list.AsQueryable(); } } catch (Exception e) { throw e; } }
/// <summary> /// RGBカラーからCMYKカラースベースへ変換する /// </summary> /// <param name="rgb">RGBカラー</param> /// <returns>CMYKカラースベース</returns> internal static Cmyk ToColor(Rgb rgb) { Cmyk cmyk = new Cmyk(); cmyk.C = 1.0d - rgb.R / 255d; cmyk.M = 1.0d - rgb.G / 255d; cmyk.Y = 1.0d - rgb.B / 255d; cmyk.K = Math.Min(cmyk.C, Math.Min(cmyk.M, cmyk.Y)); if (cmyk.K == 1.0) { cmyk.C = cmyk.M = cmyk.Y = 0; } else { cmyk.C = (cmyk.C - cmyk.K) / (1.0d - cmyk.K) / 255 * 100; cmyk.M = (cmyk.M - cmyk.K) / (1.0d - cmyk.K) / 255 * 100; cmyk.Y = (cmyk.Y - cmyk.K) / (1.0d - cmyk.K) / 255 * 100; cmyk.K = cmyk.K / 255 * 100; } //double C, M, Y, K; //C = 1.0d - (double)(rgb.R * 1.0f / 255f); //M = 1.0d - (double)(rgb.G * 1.0f / 255f); //Y = 1.0d - (double)(rgb.B * 1.0f / 255f); //K = (double)Math.Min(Math.Min(M, Y), C); //cmyk.C = (C - K) / 255 * 100; //cmyk.M = (M - K) / 255 * 100; //cmyk.Y = (Y - K) / 255 * 100; //cmyk.K = K / 255 * 100; return(cmyk); }
/// <summary> /// RGBカラーからHSVカラースベースへ変換する /// </summary> /// <param name="rgb">RGBカラー</param> /// <returns>HSVカラースベース</returns> internal static Hsv ToColor(Rgb rgb) { double min, max, tmp, S; // double H, V; double R = rgb.R * 1.0f, G = rgb.G * 1.0f, B = rgb.B * 1.0f; tmp = Math.Min(R, G); min = Math.Min(tmp, B); tmp = Math.Max(R, G); max = Math.Max(tmp, B); Hsv hsv = new Hsv(); Color color = Color.FromArgb(rgb.R, rgb.G, rgb.B); hsv.H = (int)color.GetHue(); if (max == 0) { S = 0; } else { S = 1d - (1d * min / max); } hsv.S = (int)(S * 100); hsv.V = (int)(max / 255 * 100); //Hsv hsv = new Hsv(); //// H //H = 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 = 60 * (B - R) * 1.0f / (max - min) + 120; //} //else if (max == B) //{ // H = 60 * (R - G) * 1.0f / (max - min) + 240; //} //hsv.H = (int)H; //// S //if (max == 0) //{ // S = 0; //} //else //{ // S = (max - min) * 1.0f; //} //hsv.S = (int)(S * 255); //// V //V = max; //hsv.V = (int)(V * 255); return(hsv); }
/// <summary> /// RGBカラーからHSV文字列へ変換する /// </summary> /// <param name="rgb">RGBカラー</param> /// <returns>HSV文字列</returns> public string getHsvString(Rgb rgb) { Hsv hsv = HsvConverter.ToColor(rgb); return(hsv.H.ToString() + " " + hsv.S.ToString() + "% " + hsv.V.ToString() + "%"); }
/// <summary> /// RGBカラーからHSL文字列へ変換する /// </summary> /// <param name="rgb">RGBカラー</param> /// <returns>HSL文字列</returns> public string getHslString(Rgb rgb) { Hsl hsl = HslConverter.ToColor(rgb); return(hsl.H.ToString() + "," + hsl.S.ToString() + "%," + hsl.L.ToString() + "%"); }
/// <summary> /// RGBカラーからRGB文字列へ変換する /// </summary> /// <param name="rgb">RGBカラー</param> /// <returns>RGB文字列</returns> public string getRgbString(Rgb rgb) { return(rgb.R.ToString() + "," + rgb.G.ToString() + "," + rgb.B.ToString()); }
/// <summary> /// RGBカラーからPCCSのトーンへ変換する /// </summary> /// <param name="rgb">RGBカラー</param> /// <returns>PCCSのトーン</returns> public string getPCCSTone(Rgb rgb) { return(PCCSConverter.ToColor(rgb)); }
/// <summary> /// RGBカラーからMUNSELLカラースベースへ変換する /// </summary> /// <param name="rgb">RGBカラー</param> /// <returns>MUNSELLカラースベース</returns> internal static Munsell ToColor(Rgb rgb) { Munsell item = new Munsell(); Lch lch = LchConverter.ToColor(rgb); if (rgb.R == rgb.G && rgb.G == rgb.B) { Lab lab = LabConverter.ToColor(rgb); item.H = new MunsellHue { Base = HueBase.N }; item.V = Math.Round(ConvertLtoV(lab.L), 1); return(item); } var q = Table.Select(x => new { diff = Math.Abs(x.Lch.L - lch.L) + Math.Abs(x.Lch.C - lch.C) + Math.Abs(x.Lch.H - lch.H), self = x }); var min = q.Min(x => x.diff); var munsell = q.Where(x => x.diff == min).FirstOrDefault().self; if (min < 3.0) { item.H = munsell.H; item.V = munsell.V; item.C = munsell.C; return(item); } var hue = new MunsellHue { Base = munsell.H.Base, Number = munsell.H.Number }; MunsellHue newHue; if (munsell.Lch.H > lch.H) { hue.Number -= 2.5; newHue = new MunsellHue { Base = hue.Base, Number = hue.Number }; } else { hue.Number += 2.5; newHue = new MunsellHue { Base = munsell.H.Base, Number = munsell.H.Number }; } var munsellX = FindMunsell(hue, munsell.V, munsell.C, true); newHue.Number += Math.Round((lch.H - Math.Min(munsell.Lch.H, munsellX.Lch.H)) / Math.Abs(munsell.Lch.H - munsellX.Lch.H) * 2.5, 1, MidpointRounding.AwayFromZero); double newChroma; //彩度max min var c = Table.Where(x => x.H == munsell.H && x.V == munsell.V) .GroupBy(x => x.V).Select(x => new { min = x.Min(y => y.C), max = x.Max(y => y.C) }).First(); if (c.min < munsell.C && munsell.C < c.max) { var chroma = munsell.Lch.C > lch.C ? munsell.C - 2.0 : munsell.C + 2.0; var munsellY = FindMunsell(munsell.H, munsell.V, chroma); newChroma = Math.Round(Math.Min(munsell.C, munsellY.C) + (lch.C - Math.Min(munsell.Lch.C, munsellY.Lch.C)) / Math.Abs(munsell.Lch.C - munsellY.Lch.C) * 2.0, 1, MidpointRounding.AwayFromZero); } else { newChroma = Math.Round(munsell.C / munsell.Lch.C * lch.C, 1, MidpointRounding.AwayFromZero); } var newValue = Math.Round(ConvertLtoV(lch.L), 1, MidpointRounding.AwayFromZero); item.H = newHue; item.C = newChroma; item.V = newValue; return(item); }