Beispiel #1
0
            private Color[] GetColorfulColors(Color color, int count)
            {
                Color[] colors = new Color[count];

                float h    = HSV.RGBtoHSV(color).H;
                float span = 100 / count;

                for (int i = 0; i < count; i++)
                {
                    float v = 100 - i * span;
                    float s = i % 4 * 20 + 20;
                    colors[i] = HSV.HSVtoRGB(255, h, s, v);
                }

                return(colors);
            }
Beispiel #2
0
        /// <summary>
        /// Palette color from colors
        /// </summary>
        /// <param name="colors"> Color array. </param>
        /// <returns> Color </returns>
        public static Color GetPaletteFromColors(Color[] colors)
        {
            try
            {
                //saturation
                double sumS = 0;

                //value
                double sumV = 0;
                double sumHue = 0;

                double maxV = 0;
                double maxS = 0;
                double maxH = 0;
                double count = 0;
                foreach (var color in colors)
                {
                    HSV hsv = HSV.RGBtoHSV(color);

                    if (hsv.H == 0)continue;
                    
                    maxS = hsv.S > maxS ? hsv.S : maxS;
                    maxV = hsv.V > maxV ? hsv.V : maxV;
                    maxH = hsv.H > maxH ? hsv.H : maxH;
                    sumHue += hsv.H;
                    sumS += hsv.S;
                    sumV += hsv.V;
                    count++;
                }


                double avgH = sumHue / count;
                double avgV = sumV / count;
                double avgS = sumS / count;
                double maxAvgV = maxV / 2;
                double maxAvgS = maxS / 2;
                double maxAvgH = maxH / 2;

                double h = Math.Max(maxAvgV, avgV);
                double s = Math.Min(maxAvgS, avgS);
                double hue = Math.Min(maxAvgH, avgH);

                double R = 0;
                double G = 0;
                double B = 0;
                count = 0;


                foreach (var color in colors)
                {
                    HSV hsv = HSV.RGBtoHSV(color);

                    if (hsv.H == 0) continue;

                    if (hsv.H >= hue + 10 && hsv.V >= h && hsv.S >= s)
                    {
                        R += color.R;
                        G += color.G;
                        B += color.B;
                        count++;
                    }
                }

                double r = R / count;
                double g = G / count;
                double b = B / count;

                //   if (r + g + b > 96 && r + g + b < 672)
                return Color.FromArgb(255, (byte)r, (byte)g, (byte)b);
            }
            catch (Exception)
            {
                return FallBackColor;
            }
        }