private void SetClosestIndex(Color color) { ColorMine.ColorSpaces.Rgb rgbColorStop = new ColorMine.ColorSpaces.Rgb() { R = color.R, G = color.G, B = color.B }; Tuple <Color, double, int>[] colorWeights = new Tuple <Color, double, int> [TextSurface.Cells.Length]; // Create a color weight for every cell compared to the color stop for (int x = 0; x < TextSurface.Cells.Length; x++) { ColorMine.ColorSpaces.Rgb rgbColor = new ColorMine.ColorSpaces.Rgb() { R = this[x].Background.R, G = this[x].Background.G, B = this[x].Background.B }; ColorMine.ColorSpaces.Cmy cmyColor = rgbColor.To <ColorMine.ColorSpaces.Cmy>(); colorWeights[x] = new Tuple <Color, double, int>(this[x].Background, rgbColorStop.Compare(cmyColor, new ColorMine.ColorSpaces.Comparisons.Cie1976Comparison()), x); } var foundColor = colorWeights.OrderBy(t => t.Item2).First(); this[_selectedColorPosition.X, _selectedColorPosition.Y].Glyph = 0; _selectedColorPosition = SadConsole.Surfaces.BasicSurface.GetPointFromIndex(foundColor.Item3, Width); this[_selectedColorPosition.X, _selectedColorPosition.Y].Glyph = 4; this.IsDirty = true; }
public override double Distance(Color3d circleColor, Color3d pixelColor, int distX, int distY) { if (circleColor.GetType() != pixelColor.GetType()) { throw new Exception("Can't compare colors in different color spaces"); } var circleColorRgb = circleColor.ConvertTo <ColorRgb>(); var pixelColorRgb = pixelColor.ConvertTo <ColorRgb>(); var mineCircleColor = new ColorMine.ColorSpaces.Rgb { R = circleColorRgb.R, G = circleColorRgb.G, B = circleColorRgb.B }; var minePixelColor = new ColorMine.ColorSpaces.Rgb { R = pixelColorRgb.R, G = pixelColorRgb.G, B = pixelColorRgb.B }; var ciede2000diff = mineCircleColor.Compare(minePixelColor, new ColorMine.ColorSpaces.Comparisons.CieDe2000Comparison()); int distFromPoint = (int)Math.Sqrt(distX * distX + distY * distY); return(ciede2000diff + distFromPoint); }
public double compareColor(Color c, Color k) { ColorMine.ColorSpaces.Rgb cRgb = new ColorMine.ColorSpaces.Rgb(c.R, c.G, c.B); ColorMine.ColorSpaces.Rgb kRgb = new ColorMine.ColorSpaces.Rgb(k.R, k.G, k.B); double delta = cRgb.Compare(kRgb, new ColorMine.ColorSpaces.Comparisons.Cie1976Comparison()); log.Info("delta :" + delta + " color : " + c + " and " + k); return(delta); }
// compare two Emgu CV colors using ColorMine, an API for C# public static int colorDifference(Bgr c1, Bgr c2) { var myRGB1 = new ColorMine.ColorSpaces.Rgb { R = c1.Red, G = c1.Green, B = c1.Blue }; var myRGB2 = new ColorMine.ColorSpaces.Rgb { R = c2.Red, G = c2.Green, B = c2.Blue }; return((int)myRGB1.Compare(myRGB2, new Cie1976Comparison())); }
/// <inheritdoc /> public override void UpdateAndDraw(ControlBase control, TimeSpan time) { if (!(control is HueBarControl bar)) { return; } if (!bar.IsDirty) { return; } control.Surface.Fill(Color.White, Color.Black, 0, null); bar._positions = control.Width; ColorGradient gradient = new ColorGradient(Color.Red, Color.Yellow, Color.Green, Color.Turquoise, Color.Blue, Color.Purple, Color.Red); for (int x = 0; x < control.Width; x++) { control.Surface[x, 0].Glyph = 219; control.Surface[x, 0].Foreground = gradient.Lerp((float)x / (float)(control.Width - 1)); } control.Surface[bar.SelectedPosition, 1].Glyph = 30; control.Surface[bar.SelectedPosition, 1].Foreground = Color.LightGray;//this[_selectedPosition, 0].Foreground; // Build an array of all the colors Color[] colors = new Color[control.Width]; for (int x = 0; x < control.Width; x++) { colors[x] = control.Surface[x, 0].Foreground; } List <int> colorIndexesFinished = new List <int>(control.Width); foreach (var stop in gradient.Stops) { ColorMine.ColorSpaces.Rgb rgbColorStop = new ColorMine.ColorSpaces.Rgb() { R = stop.Color.R, G = stop.Color.G, B = stop.Color.B }; Tuple <Color, double, int>[] colorWeights = new Tuple <Color, double, int> [control.Width]; // Create a color weight for every cell compared to the color stop for (int x = 0; x < control.Width; x++) { if (!colorIndexesFinished.Contains(x)) { ColorMine.ColorSpaces.Rgb rgbColor = new ColorMine.ColorSpaces.Rgb() { R = colors[x].R, G = colors[x].G, B = colors[x].B }; ColorMine.ColorSpaces.Cmy cmyColor = rgbColor.To <ColorMine.ColorSpaces.Cmy>(); colorWeights[x] = new Tuple <Color, double, int>(colors[x], rgbColorStop.Compare(cmyColor, new ColorMine.ColorSpaces.Comparisons.Cie1976Comparison()), x); } else { colorWeights[x] = new Tuple <Color, double, int>(colors[x], 10000, x); } } var foundColor = colorWeights.OrderBy(t => t.Item2).First(); control.Surface[foundColor.Item3, 0].Foreground = stop.Color; colorIndexesFinished.Add(foundColor.Item3); } control.IsDirty = false; }
/// <summary> /// Return best color match by computing the metric distance with the selected formula /// </summary> public static JToken GetNearestColor(string colorHex, JObject jColorList) { int colorR = int.Parse(colorHex.Substring(1, 2), System.Globalization.NumberStyles.AllowHexSpecifier); int colorG = int.Parse(colorHex.Substring(3, 2), System.Globalization.NumberStyles.AllowHexSpecifier); int colorB = int.Parse(colorHex.Substring(5, 2), System.Globalization.NumberStyles.AllowHexSpecifier); var colorRgb = new ColorMine.ColorSpaces.Rgb { R = colorR, G = colorG, B = colorB }; double bestDistance = -1; JToken nearestColor = null; string nearestColorHex = null; JObject hueColorsList = null; if (jColorList["Info"]["hasHueValues"].ToObject <bool>() == true && jColorList.ContainsKey("HueColors")) { hueColorsList = jColorList["HueColors"].ToObject <JObject>(); } foreach (var item in jColorList["Colors"].ToObject <JObject>()) { string itemColorHex = item.Key; if (string.Compare(item.Key, colorHex, true) == 0) { bestDistance = 0; nearestColor = item.Value; nearestColorHex = item.Key; break; } int nearestColorR = int.Parse(itemColorHex.Substring(1, 2), System.Globalization.NumberStyles.AllowHexSpecifier); int nearestColorG = int.Parse(itemColorHex.Substring(3, 2), System.Globalization.NumberStyles.AllowHexSpecifier); int nearestColorB = int.Parse(itemColorHex.Substring(5, 2), System.Globalization.NumberStyles.AllowHexSpecifier); var itemRgb = new ColorMine.ColorSpaces.Rgb { R = nearestColorR, G = nearestColorG, B = nearestColorB }; // Space comparison formulas: https://en.wikipedia.org/wiki/Color_difference // Note: Delta-e calculations are quasimetric, // the result of comparing color a to b isn't always equal to comparing color b to a // but it will probably be pretty close double deltaE = colorRgb.Compare(itemRgb, Common.spaceComparison); if (bestDistance < 0 || bestDistance > deltaE) { bestDistance = deltaE; nearestColor = item.Value; nearestColorHex = item.Key; } } // Add color info if (nearestColor != null) { nearestColor["hex"] = nearestColorHex; int nearestColorR = int.Parse(nearestColorHex.Substring(1, 2), System.Globalization.NumberStyles.AllowHexSpecifier); int nearestColorG = int.Parse(nearestColorHex.Substring(3, 2), System.Globalization.NumberStyles.AllowHexSpecifier); int nearestColorB = int.Parse(nearestColorHex.Substring(5, 2), System.Globalization.NumberStyles.AllowHexSpecifier); nearestColor["rgb"] = string.Format("{0}, {1}, {2}", nearestColorR, nearestColorG, nearestColorB); nearestColor["distance"] = bestDistance; // Find Hue color info if (hueColorsList != null) { string hueName = nearestColor["hueName"].ToString(); if (hueColorsList.ContainsKey(hueName) == true) { nearestColor["hueHex"] = hueColorsList[hueName]["hex"]; } } } return(nearestColor); }
private void SetClosestIndex(Color color) { ColorMine.ColorSpaces.Rgb rgbColorStop = new ColorMine.ColorSpaces.Rgb() { R = color.R, G = color.G, B = color.B }; Tuple <Color, double, int>[] colorWeights = new Tuple <Color, double, int> [Width]; // Create a color weight for every cell compared to the color stop for (int x = 0; x < Width; x++) { ColorMine.ColorSpaces.Rgb rgbColor = new ColorMine.ColorSpaces.Rgb() { R = this[x, 0].Foreground.R, G = this[x, 0].Foreground.G, B = this[x, 0].Foreground.B }; ColorMine.ColorSpaces.Cmy cmyColor = rgbColor.To <ColorMine.ColorSpaces.Cmy>(); colorWeights[x] = new Tuple <Color, double, int>(this[x, 0].Foreground, rgbColorStop.Compare(cmyColor, new ColorMine.ColorSpaces.Comparisons.Cie1976Comparison()), x); } var foundColor = colorWeights.OrderBy(t => t.Item2).First(); _selectedPosition = foundColor.Item3; this.IsDirty = true; }
// compare two Emgu CV colors using ColorMine, an API for C# public static int colorDifference(Bgr c1, Bgr c2) { var myRGB1 = new ColorMine.ColorSpaces.Rgb { R = c1.Red, G = c1.Green, B = c1.Blue }; var myRGB2 = new ColorMine.ColorSpaces.Rgb { R = c2.Red, G = c2.Green, B = c2.Blue }; return (int)myRGB1.Compare(myRGB2, new Cie1976Comparison()); }
private void SetClosestIndex(Color color) { ColorMine.ColorSpaces.Rgb rgbColorStop = new ColorMine.ColorSpaces.Rgb() { R = color.R, G = color.G, B = color.B }; Tuple<Color, double, int>[] colorWeights = new Tuple<Color, double, int>[Width]; // Create a color weight for every cell compared to the color stop for (int x = 0; x < Width; x++) { ColorMine.ColorSpaces.Rgb rgbColor = new ColorMine.ColorSpaces.Rgb() { R = this[x, 0].Foreground.R, G = this[x, 0].Foreground.G, B = this[x, 0].Foreground.B }; ColorMine.ColorSpaces.Cmy cmyColor = rgbColor.To<ColorMine.ColorSpaces.Cmy>(); colorWeights[x] = new Tuple<Color, double, int>(this[x, 0].Foreground, rgbColorStop.Compare(cmyColor, new ColorMine.ColorSpaces.Comparisons.Cie1976Comparison()), x); } var foundColor = colorWeights.OrderBy(t => t.Item2).First(); _selectedPosition = foundColor.Item3; this.IsDirty = true; }
public override void Compose() { if (this.IsDirty) { this.Fill(Color.White, Color.Black, 0, null); _positions = Width; ColorGradient gradient = new ColorGradient(Color.Red, Color.Yellow, Color.Green, Color.Turquoise, Color.Blue, Color.Purple, Color.Red); for (int x = 0; x < Width; x++) { this[x, 0].GlyphIndex = 219; this[x, 0].Foreground = gradient.Lerp((float)x / (float)(Width - 1)); } this[_selectedPosition, 1].GlyphIndex = 30; this[_selectedPosition, 1].Foreground = Color.LightGray;//this[_selectedPosition, 0].Foreground; // Build an array of all the colors Color[] colors = new Color[Width]; for (int x = 0; x < Width; x++) colors[x] = this[x, 0].Foreground; List<int> colorIndexesFinished = new List<int>(Width); foreach (var stop in gradient.Stops) { ColorMine.ColorSpaces.Rgb rgbColorStop = new ColorMine.ColorSpaces.Rgb() { R = stop.Color.R, G = stop.Color.G, B = stop.Color.B }; Tuple<Color, double, int>[] colorWeights = new Tuple<Color, double, int>[Width]; // Create a color weight for every cell compared to the color stop for (int x = 0; x < Width; x++) { if (!colorIndexesFinished.Contains(x)) { ColorMine.ColorSpaces.Rgb rgbColor = new ColorMine.ColorSpaces.Rgb() { R = colors[x].R, G = colors[x].G, B = colors[x].B }; ColorMine.ColorSpaces.Cmy cmyColor = rgbColor.To<ColorMine.ColorSpaces.Cmy>(); colorWeights[x] = new Tuple<Color, double, int>(colors[x], rgbColorStop.Compare(cmyColor, new ColorMine.ColorSpaces.Comparisons.Cie1976Comparison()), x); } else colorWeights[x] = new Tuple<Color, double, int>(colors[x], 10000, x); } var foundColor = colorWeights.OrderBy(t => t.Item2).First(); this[foundColor.Item3, 0].Foreground = stop.Color; colorIndexesFinished.Add(foundColor.Item3); } this.IsDirty = false; } }
private void SetClosestIndex(Color color) { ColorMine.ColorSpaces.Rgb rgbColorStop = new ColorMine.ColorSpaces.Rgb() { R = color.R, G = color.G, B = color.B }; Tuple<Color, double, int>[] colorWeights = new Tuple<Color, double, int>[textSurface.Cells.Length]; // Create a color weight for every cell compared to the color stop for (int x = 0; x < textSurface.Cells.Length; x++) { ColorMine.ColorSpaces.Rgb rgbColor = new ColorMine.ColorSpaces.Rgb() { R = this[x].Background.R, G = this[x].Background.G, B = this[x].Background.B }; ColorMine.ColorSpaces.Cmy cmyColor = rgbColor.To<ColorMine.ColorSpaces.Cmy>(); colorWeights[x] = new Tuple<Color, double, int>(this[x].Background, rgbColorStop.Compare(cmyColor, new ColorMine.ColorSpaces.Comparisons.Cie1976Comparison()), x); } var foundColor = colorWeights.OrderBy(t => t.Item2).First(); this[_selectedColorPosition.X, _selectedColorPosition.Y].GlyphIndex = 0; _selectedColorPosition = SadConsole.Consoles.TextSurface.GetPointFromIndex(foundColor.Item3, Width); this[_selectedColorPosition.X, _selectedColorPosition.Y].GlyphIndex = 4; this.IsDirty = true; }