public static double[][] TransformationMatrix(ColorSpace colorSpace, doublePoint whitePoint)
        {
            double[][] value = new double[3][];
            value[0] = new double[3] {
                colorSpace.Red.X, colorSpace.Green.X, colorSpace.Blue.X
            };
            value[1] = new double[3] {
                colorSpace.Red.Y, colorSpace.Green.Y, colorSpace.Blue.Y
            };
            value[2] = new double[3];
            for (int i = 0; i < 3; i++)
            {
                value[2][i] = 1 - value[1][i] - value[0][i];
            }

            double[][] WPvector = new double[3][];
            WPvector[0] = new double[1] {
                whitePoint.X / whitePoint.Y
            };
            WPvector[1] = new double[1] {
                1
            };
            WPvector[2] = new double[1] {
                (1 - whitePoint.X - whitePoint.Y) / whitePoint.Y
            };

            double[][] result = MatrixCalculations.MatrixProduct((MatrixCalculations.MatrixInverse(value)), WPvector);
            double[][] temp   = MatrixCalculations.MatrixCreate(3, 3);
            for (int i = 0; i < 3; i++)
            {
                temp[i][i] = result[i][0];
            }
            result = MatrixCalculations.MatrixProduct(value, temp);
            return(result);
        }
 public ColorSpace(doublePoint red, doublePoint green, doublePoint blue, double gamma, string illuminnant)
 {
     Red              = red;
     Green            = green;
     Blue             = blue;
     this.Gamma       = gamma;
     this.illuminnant = illuminnant;
 }
        public static bool ToLAB(ref GlobalObjects GObjects, ColorSpace colorSpace, doublePoint whitePoint)
        {
            if (GObjects.MainPicture == null)
            {
                return(false);
            }
            GObjects.Chanel1 = new DirectBitmap(GObjects.MainPicture.Width, GObjects.MainPicture.Height);
            GObjects.Chanel2 = new DirectBitmap(GObjects.MainPicture.Width, GObjects.MainPicture.Height);
            GObjects.Chanel3 = new DirectBitmap(GObjects.MainPicture.Width, GObjects.MainPicture.Height);

            double[][] matrix   = TransformationMatrix(colorSpace, whitePoint);
            double[][] WPvector = new double[][] { new double[] { whitePoint.X / whitePoint.Y }, new double[] { 1 }, new double[] { (1 - whitePoint.X - whitePoint.Y) / whitePoint.Y } };
            for (int i = 0; i < GObjects.MainPicture.Height; i++)
            {
                for (int j = 0; j < GObjects.MainPicture.Width; j++)
                {
                    double R = Math.Pow(GObjects.MainPicture.GetPixel(j, i).R / 255.0, colorSpace.Gamma);
                    double G = Math.Pow(GObjects.MainPicture.GetPixel(j, i).G / 255.0, colorSpace.Gamma);
                    double B = Math.Pow(GObjects.MainPicture.GetPixel(j, i).B / 255.0, colorSpace.Gamma);

                    double[][] RGBvector = new double[][] { new double[] { R }, new double[] { G }, new double[] { B } };
                    double[][] XYZvector = MatrixCalculations.MatrixProduct(matrix, RGBvector);

                    var Values = VectorFunction(XYZvector[0][0] / WPvector[0][0], XYZvector[1][0] / WPvector[1][0], XYZvector[2][0] / WPvector[2][0]);

                    int Lvalue = Convert.ToInt32(116 * Values.fy - 16);
                    int Avalue = Convert.ToInt32(500 * (Values.fx - Values.fy));
                    int Bvalue = Convert.ToInt32(200 * (Values.fy - Values.fz));

                    GObjects.Chanel1.SetPixel(j, i, Color.FromArgb(Math.Max(Math.Min(255, Lvalue), 0), Math.Max(Math.Min(255, Lvalue), 0), Math.Max(Math.Min(255, Lvalue), 0)));
                    GObjects.Chanel2.SetPixel(j, i, Color.FromArgb(Math.Max(0, Math.Min(255, 127 + Avalue)), Math.Max(0, Math.Min(255, 127 - Avalue)), 127));
                    GObjects.Chanel3.SetPixel(j, i, Color.FromArgb(Math.Max(0, Math.Min(255, 127 + Bvalue)), 127, Math.Max(0, Math.Min(255, 127 - Bvalue))));
                }
            }
            return(true);
        }