Example #1
0
        public WriteableBitmap ProcessImage(BitmapImage originalBitmapImage)
        {
            WriteableBitmap writableImage = new WriteableBitmap(originalBitmapImage);

            byte[] byteArr = writableImage.WriteableBitMapImageToArray();

            for (int i = 0; i < byteArr.Length; i += 4)
            {
                byte a = byteArr[i + 3];

                if (a > 0)
                {
                    double ad = (double)a / 255.0;
                    double rd = (double)byteArr[i + 2] / ad;
                    double gd = (double)byteArr[i + 1] / ad;
                    double bd = (double)byteArr[i + 0] / ad;

                    double luminance = 0.2126 * rd + 0.7152 * gd + 0.0722 * bd;
                    double newR      = luminance * ad;

                    int interval = 256 / this.Levels;
                    int low = 0, high = interval;
                    for (int j = 0; j < this.Levels; j++)
                    {
                        if (newR > low && newR < high)
                        {
                            if (newR - low > high - newR)
                            {
                                newR = high;
                            }
                            else
                            {
                                newR = low;
                            }
                        }

                        low  += interval;
                        high += interval;
                    }

                    if (newR > 255)
                    {
                        newR = 255;
                    }
                    byteArr[i + 0] = (byte)newR;
                    byteArr[i + 1] = (byte)newR;
                    byteArr[i + 2] = (byte)newR;
                }
            }

            WriteableBitmap result = originalBitmapImage.ByteArrayToWritableBitmap(byteArr);

            return(result);
        }