Пример #1
0
        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);
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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() + "%");
        }
Пример #6
0
        /// <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() + "%");
        }
Пример #7
0
 /// <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());
 }
Пример #8
0
 /// <summary>
 /// RGBカラーからPCCSのトーンへ変換する
 /// </summary>
 /// <param name="rgb">RGBカラー</param>
 /// <returns>PCCSのトーン</returns>
 public string getPCCSTone(Rgb rgb)
 {
     return(PCCSConverter.ToColor(rgb));
 }
Пример #9
0
        /// <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);
        }