12,701,125 members (29,266 online)
Tip/Trick
alternative version

11.4K views
7 bookmarked
Posted

# Image (colour) manipulation with ColorMatrix

, 4 May 2010 CPOL
 Rate this:
Below is a code snippet derived from a few of the ideas in the article at Matrix Operations for Image Manipulation[^].Whilst this code is C# it should be easily convertible to VB or Managed C++.These three simple Methods make use of the ColorMatrix to achieve variations in the colour...
Below is a code snippet derived from a few of the ideas in the article at Matrix Operations for Image Manipulation[^].

Whilst this code is C# it should be easily convertible to VB or Managed C++.

These three simple Methods make use of the `ColorMatrix` to achieve variations in the colour saturation.

This is the Method that does all the work.
```		private void ApplySaturation(float saturation)
{
float rWeight = 0.3086f;
float gWeight = 0.6094f;
float bWeight = 0.0820f;

float a = (1.0f - saturation) * rWeight + saturation;
float b = (1.0f - saturation) * rWeight;
float c = (1.0f - saturation) * rWeight;
float d = (1.0f - saturation) * gWeight;
float e = (1.0f - saturation) * gWeight + saturation;
float f = (1.0f - saturation) * gWeight;
float g = (1.0f - saturation) * bWeight;
float h = (1.0f - saturation) * bWeight;
float i = (1.0f - saturation) * bWeight + saturation;

// Create a Graphics
using (Graphics gr = this.CreateGraphics())
{
gr.Clear(this.BackColor);
// Create a Bitmap
using (Bitmap curBitmap = new Bitmap("roses.jpg"))
{
// ColorMatrix elements
float[][] ptsArray = {
new float[] {a,  b,  c,  0, 0},
new float[] {d,  e,  f,  0, 0},
new float[] {g,  h,  i,  0, 0},
new float[] {0,  0,  0,  1, 0},
new float[] {0, 0, 0, 0, 1}
};
// Create ColorMatrix
ColorMatrix clrMatrix = new ColorMatrix(ptsArray);
// Create ImageAttributes
ImageAttributes imgAttribs = new ImageAttributes();
// Set color matrix
imgAttribs.SetColorMatrix(clrMatrix,
ColorMatrixFlag.Default,
// Draw Image with no effects
gr.DrawImage(curBitmap, 0, 0, 200, 200);
// Draw Image with image attributes
gr.DrawImage(curBitmap,
new Rectangle(205, 0, 200, 200),
0, 0, curBitmap.Width, curBitmap.Height,
GraphicsUnit.Pixel, imgAttribs);
}
}
}
```

This will convert an image to GreyScale. Use a
```saturation<code> of zero.
<pre>
public void GreyScale()
{
ApplySaturation(0.0f);
}
</pre>```
of 0.5f.
```    public void Fade()
{
ApplySaturation(0.5f);
}
```

This will give the complementary colours for an image. Use a `saturation` of -1.0f.
```    public void Complement()
{
ApplySaturation(-1.0f);
}
```

Obviously you should substitute one of your own images for "roses.jpg", the more colourful the better.

## Share

 Retired United Kingdom
Mainly on Systems for Local Government, Health Authorities,
Insurance Industry - (COBOL eeeeeeeugh).
Inventor of Synchronized Shopping.