public void ConvertLinearSRgbToXyz()
{
const double m11 = 8504.0 / 20625.0;
const double m12 = 447.0 / 1250.0;
const double m13 = 361.0 / 2000.0;
const double m21 = 1063.0 / 5000.0;
const double m22 = 447.0 / 625.0;
const double m23 = 361.0 / 5000.0;
const double m31 = 1063.0 / 55000.0;
const double m32 = 149.0 / 1250.0;
const double m33 = 28519.0 / 30000.0;
double r = Component1;
double g = Component2;
double b = Component3;
Component1 = (m11 * r + m12 * g + m13 * b);
Component2 = (m21 * r + m22 * g + m23 * b);
Component3 = (m31 * r + m32 * g + m33 * b);
}
private static Tuple<Color, double, double>[] GenerateColors() { var result = new Tuple<Color, double, double>[256 * 256 * 256]; int i = 0; for (short r = 0; r < 256; ++r) { for (short g = 0; g < 256; ++g) { for (short b = 0; b < 256; ++b) { ColorVector colorVector = new ColorVector(r / 255.0, g / 255.0, b / 255.0); colorVector.ConvertSRgbToLinearSRgb(); colorVector.ConvertLinearSRgbToXyz(); colorVector.ConvertXyzToXyy(); double hue = Math.Atan2(colorVector.Component2 - D65.SmallY, colorVector.Component1 - D65.SmallX); result[i] = new Tuple<Color, double, double>(Color.FromArgb(r, g, b), colorVector.Component3, hue); if (i % 1000000 == 0) { Console.WriteLine(i); } i++; } } } return result; }