Пример #1
0
        public void RgbToXyz(int[] rgb, double[] xyz)
        {
            var rgbColor = Color.FromArgb(rgb[0], rgb[1], rgb[2]);

            Assert.Equal(
                new XyzColor(xyz[0], xyz[1], xyz[2]),
                XyzColor.FromRgb(rgbColor)
                );
        }
Пример #2
0
        public IEnumerable <Color> PickColors(Bitmap bitmap, int count)
        {
            var(thumb, width, height) = Resize(bitmap, 72);
            using (thumb)
            {
                var colors     = GetColors(thumb, width, height);
                var xyzColors  = colors.Select(x => XyzColor.FromRgb(x));
                var labColors  = xyzColors.Select(x => CieLabColor.FromXyz(x));
                var labSpace   = new CieLabSpace();
                var selections = KmeansPlusPlus(labColors.ToArray(), labSpace, count, _seed);

                return(selections.Select(x => labSpace.GetCentroid(x)).Select(x => x.ToXyzColor().ToRgbColor()));
            }
        }
Пример #3
0
        public static CieLabColor FromXyz(XyzColor color)
        {
            double F(double t) => t > 0.00885645167903563/* Math.Pow(Delta, 3) */
                ? Math.Pow(t, 1.0 / 3.0)
                : 7.78703703703704 /* 1.0 / (3.0 * Math.Pow(Delta, 2))*/ * t + 0.137931034482759 /* 4.0 / 29.0 */;

            var x = color.X * 100;
            var y = color.Y * 100;
            var z = color.Z * 100;

            var fYPerYn = F(y / Yn);

            return(new CieLabColor
                   (
                       Math.Round(116.0 * fYPerYn - 16.0, 4),
                       Math.Round(500.0 * (F(x / Xn) - fYPerYn), 4),
                       Math.Round(200.0 * (fYPerYn - F(z / Zn)), 4)
                   ));
        }