public DoubleImage ToDoubleImage(int width, int height)
        {
            DoubleImage image = new DoubleImage(width, height);

            for (int i = 0; i < image.Height; i++)
            {
                for (int j = 0; j < image.Width; j++)
                {
                    int index = i * image.Width + j;

                    //black
                    if (this[index] == 0)
                    {
                        image.SetPixel(i, j, 0, 0, 0);
                    }


                    //white
                    if (this[index] == 1)
                    {
                        image.SetPixel(i, j, 255, 255, 255);
                    }
                }
            }
            return(image);
        }
        public DoubleImage UpdateColorComponent(ColorComponent component, double[,] colorComponent)
        {
            DoubleImage updatedImage = this;

            switch (component)
            {
            case ColorComponent.Red:
                for (int i = 0; i < this.Height; i++)
                {
                    for (int j = 0; j < this.Width; j++)
                    {
                        DoublePixel initialPixel = this.GetPixel(i, j);
                        updatedImage.SetPixel(i, j, colorComponent[i, j], initialPixel.Green, initialPixel.Blue);
                    }
                }
                break;

            case ColorComponent.Green:
                for (int i = 0; i < this.Height; i++)
                {
                    for (int j = 0; j < this.Width; j++)
                    {
                        DoublePixel initialPixel = this.GetPixel(i, j);
                        updatedImage.SetPixel(i, j, initialPixel.Red, colorComponent[i, j], initialPixel.Blue);
                    }
                }
                break;

            case ColorComponent.Blue:
                for (int i = 0; i < this.Height; i++)
                {
                    for (int j = 0; j < this.Width; j++)
                    {
                        DoublePixel initialPixel = this.GetPixel(i, j);
                        updatedImage.SetPixel(i, j, initialPixel.Red, initialPixel.Green, colorComponent[i, j]);
                    }
                }
                break;
            }
            return(updatedImage);
        }
        public static DoubleImage FillWithSmallerImage(DoubleImage bigImage, DoubleImage smallImage)
        {
            if (smallImage.Height > bigImage.Height || smallImage.Width > bigImage.Width)
            {
                return(smallImage);
            }

            double[,] greenSmall = smallImage.GetColorComponent(ColorComponent.Red);
            double[,] greenBig   = bigImage.GetColorComponent(ColorComponent.Red);

            int jEnd            = greenSmall.GetLength(1) - 1;
            int iEnd            = greenSmall.GetLength(0) - 1;
            int countOfChecking = Math.Min(smallImage.Height, smallImage.Width) / 2;

            int iStart = 0;
            int jStart = 0;

            bool isFound = false;

            for (int i = bigImage.Height - 1; i >= 0; i--)
            {
                if (isFound)
                {
                    break;
                }
                for (int j = bigImage.Width - 1; j >= 0; j--)
                {
                    if (greenBig[i, j] == greenSmall[iEnd, jEnd])
                    {
                        isFound = true;
                        for (int k = 1; k < countOfChecking; k++)
                        {
                            if (greenBig[i - k, j - k] != greenSmall[iEnd - k, jEnd - k])
                            {
                                isFound = false;
                                break;
                            }
                        }
                        if (isFound)
                        {
                            iStart = i - smallImage.Height;
                            jStart = j - smallImage.Width;
                            Console.WriteLine("iStart {0}", iStart);
                            Console.WriteLine("jStart {0}", jStart);
                            Console.WriteLine("iEnd {0}", iEnd);
                            Console.WriteLine("jEnd {0}", jEnd);
                            break;
                        }
                    }
                }
            }

            DoubleImage updateSmallImage = new DoubleImage(bigImage.Width, bigImage.Height);


            for (int i = 0; i < bigImage.Width; i++)
            {
                for (int j = 0; j < bigImage.Height; j++)
                {
                    if (iStart <= i && i <= iStart + iEnd && jStart <= j && j <= jStart + jEnd)
                    {
                        DoublePixel pixel = smallImage.GetPixel(i - iStart, j - jStart);
                        updateSmallImage.SetPixel(i, j, pixel.Red, pixel.Green, pixel.Blue);
                    }
                    else
                    {
                        updateSmallImage.SetPixel(i, j, 255, 255, 255);
                    }
                }
            }

            return(updateSmallImage);
        }