[C# Helper]
Index Books FAQ Contact About Rod
[Beginning Database Design Solutions, Second Edition]

[Beginning Software Engineering, Second Edition]

[Essential Algorithms, Second Edition]

[The Modern C# Challenge]

[WPF 3d, Three-Dimensional Graphics with WPF and C#]

[The C# Helper Top 100]

[Interview Puzzles Dissected]

[C# 24-Hour Trainer]

[C# 5.0 Programmer's Reference]

[MCSD Certification Toolkit (Exam 70-483): Programming in C#]

Title: Use an ImageAttributes object to convert an image to monochrome in C#

convert an image to monochrome

This example shows a quick and easy way to convert an image to monochrome. The example Quickly convert an image to grayscale in C# shows one way to convert an image to grayscale. It does that buy looping through the image's pixels and setting each pixel's red, green, and blue color components to a weighted average of those components. This example uses an ImageAttributes object to make a similar conversion even more quickly.

The following ToMonochrome method converts an image into monochrome.

// Convert an image to monochrome. private Bitmap ToMonochrome(Image image) { // Make the ColorMatrix. ColorMatrix cm = new ColorMatrix(new float[][] { new float[] {0.299f, 0.299f, 0.299f, 0, 0}, new float[] {0.587f, 0.587f, 0.587f, 0, 0}, new float[] {0.114f, 0.114f, 0.114f, 0, 0}, new float[] { 0, 0, 0, 1, 0}, new float[] { 0, 0, 0, 0, 1} }); ImageAttributes attributes = new ImageAttributes(); attributes.SetColorMatrix(cm); // Draw the image onto the new bitmap while // applying the new ColorMatrix. Point[] points = { new Point(0, 0), new Point(image.Width, 0), new Point(0, image.Height), }; Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); // Make the result bitmap. Bitmap bm = new Bitmap(image.Width, image.Height); using (Graphics gr = Graphics.FromImage(bm)) { gr.DrawImage(image, points, rect, GraphicsUnit.Pixel, attributes); } // Return the result. return bm; }

The key is the ColorMatrix object. If a pixel initially has color components R, G, and B, this matrix makes its new components all equal to 0.299 * R + 0.587 * G + 0.114 * B. The result is a weighted average that produces a nice monochrome result. (You can set all of the matrix's non-zero entries to 0.33f if you want to use a non-weighted average, but the weighted version produces a slightly better result.)

See the example Use an ImageAttributes object to adjust an image's brightness in C# for additional details about how the drawing part works.

Download the example to experiment with it and to see additional details.

© 2009-2023 Rocky Mountain Computer Consulting, Inc. All rights reserved.