private void decolorizeGeneratorWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            int width  = (e.Argument as DecolorizeGenTaskData).width;
            int height = (e.Argument as DecolorizeGenTaskData).height;

            int[] pixels = (e.Argument as DecolorizeGenTaskData).pixels;

            int[] grayscale_pixels = pixels.Clone() as int[];

            for (int i = 0; i < grayscale_pixels.Length; i++)
            {
                byte[] color = BitConverter.GetBytes(grayscale_pixels[i]);

                byte gray = (byte)((color[0] * 11 + color[1] * 16 + color[2] * 5) / 32);

                grayscale_pixels[i] = (color[3] << 24) | (gray << 16) | (gray << 8) | gray;
            }

            DecolorizeGenTaskData task_data = new DecolorizeGenTaskData();

            task_data.width  = width;
            task_data.height = height;
            task_data.pixels = grayscale_pixels;

            e.Result = task_data;
        }
        private void LoadImage(WriteableBitmap bitmap)
        {
            if (bitmap.PixelWidth != 0 && bitmap.PixelHeight != 0)
            {
                this.loadedBitmap = bitmap;

                DecolorizeGenTaskData task_data = new DecolorizeGenTaskData();

                task_data.width  = bitmap.PixelWidth;
                task_data.height = bitmap.PixelHeight;
                task_data.pixels = bitmap.Pixels;

                this.decolorizeGeneratorWorker.RunWorkerAsync(task_data);

                this.GenerationProgressIndicator.IsVisible = true;
            }
        }