Jeff Sanders Technical Blog

I am a Microsoft employee that has worked on all aspects of the Web Stack for a long time. I hope these blogs are useful to you! Use this information at your own risk.


<< Go Back

How To Convert An Image To Grayscale

- 25 Nov 2013

I ran across an issue where I wanted to convert an Image in a Windows Store app  to grayscale and could not find a great example.  So… here is one for you to try!

 private async Task imageToGrayscale(Image src, Image dest)
        {
            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
            //Get existing src pixels in a Byte[] (always is BRGA formate
            await renderTargetBitmap.RenderAsync(src);
            IBuffer pixelSrc = await renderTargetBitmap.GetPixelsAsync();
            Byte[] destBytes = new Byte[pixelSrc.Length];
            for (int i = 0; i < pixelSrc.Length; i += 4)
            {
                double b = (double)pixelSrc.GetByte((uint)i) / 255.0;
                double g = (double)pixelSrc.GetByte((uint)i+1) / 255.0;
                double r = (double)pixelSrc.GetByte((uint)i+2) / 255.0;
                byte a = pixelSrc.GetByte((uint)i + 3);
                double e = (0.21 * r + 0.71 * g + 0.07 * b) * 255;
                byte f = Convert.ToByte(e);
                destBytes[i] = f;
                destBytes[i + 1] = f;
                destBytes[i + 2] = f;
                destBytes[i + 3] = a;
            }
            WriteableBitmap destWB = new WriteableBitmap(renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight);
            using (Stream pixelStream = destWB.PixelBuffer.AsStream()) {
                pixelStream.Seek(0, SeekOrigin.Begin);
                pixelStream.Write(destBytes, 0, destBytes.Length);
                destWB.Invalidate();
            }
            destImage.Source = destWB;
        }

If you like it, drop me a note of thanks!

<< Go Back