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) ); }
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())); } }
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) )); }