public int CompareTo(Color other) { int comparison; var thisCategory = GetColorCategory(); comparison = ((int)thisCategory).CompareTo((int)other.GetColorCategory()); if (comparison != 0) { return(comparison); } comparison = ColorConversion.RgbToLum(ColorConversion.ColorToRgb(this)) .CompareTo(ColorConversion.RgbToLum(ColorConversion.ColorToRgb(other))); if ((int)thisCategory % 2 == 0) { comparison = -comparison; } if (comparison != 0) { return(comparison); } return(comparison); }
private static Vector3i ColorToPoint(Color color) { var rgb = ColorConversion.ColorToRgb(color); var xyz = ColorConversion.RgbToXyz(rgb); var lab = ColorConversion.XyzToLab(xyz); return(lab); }
public Texture3D(Stream stream) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } int[] bitmapArray; using (var image = Image.FromStream(stream)) using (var bitmap = new Bitmap(image)) { BitmapData bitmapData = null; try { bitmapData = bitmap.LockBits( new Rectangle(Point.Empty, bitmap.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Trace.Assert(bitmapData.Stride % sizeof(int) == 0); bitmapArray = new int[(bitmapData.Stride / sizeof(int)) * bitmapData.Height]; Marshal.Copy(bitmapData.Scan0, bitmapArray, 0, bitmapArray.Length); Pixels = new Vector3[ bitmapData.Height, bitmapData.Height, bitmapData.Width / bitmapData.Height ]; } finally { if (bitmapData != null) { bitmap.UnlockBits(bitmapData); } } } var size = Size; var w = size[0]; var h = size[1]; var d = size[2]; var stride = w * d; for (var i = 0; i < bitmapArray.Length; i++) { var x = i % w; var y = i / stride; y = (h - 1) - y; // Invert y axis var z = (i / w) % d; var color = Color.FromUint((uint)bitmapArray[i]); var rgb = ColorConversion.ColorToRgb(color); Pixels[x, y, z] = rgb; } }
private ColorCategory GetColorCategory() { var rgb = ColorConversion.ColorToRgb(this); var hsv = ColorConversion.RgbToHsv(rgb); if (hsv[1] < 0.12f) { return(ColorCategory.Grays); } float lumCutoff; if (hsv[1] > 0.9) { lumCutoff = 0.1f; } else if (hsv[1] > 0.8) { lumCutoff = 0.13f; } else if (hsv[1] > 0.6) { lumCutoff = 0.19f; } else if (hsv[1] > 0.4) { lumCutoff = 0.22f; } else { lumCutoff = 0.28f; } var lum = Math.Sqrt(ColorConversion.RgbToLum(rgb)); if (lum < lumCutoff) { return(ColorCategory.Grays); } if (hsv[0] <= 26) { return(ColorCategory.Red); } if (hsv[0] <= 44) { return(ColorCategory.Orange); } if (hsv[0] <= 69) { return(ColorCategory.Yellow); } if (hsv[0] <= 152) { return(ColorCategory.Green); } if (hsv[0] <= 184) { return(ColorCategory.Cyan); } if (hsv[0] <= 257) { return(ColorCategory.Blue); } if (hsv[0] <= 296) { return(ColorCategory.Purple); } if (hsv[0] <= 330) { return(ColorCategory.Pink); } return(ColorCategory.Red); }