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;
using (Graphics gr = this.CreateGraphics())
{
gr.Clear(this.BackColor);
using (Bitmap curBitmap = new Bitmap("roses.jpg"))
{
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}
};
ColorMatrix clrMatrix = new ColorMatrix(ptsArray);
ImageAttributes imgAttribs = new ImageAttributes();
imgAttribs.SetColorMatrix(clrMatrix,
ColorMatrixFlag.Default,
ColorAdjustType.Default);
gr.DrawImage(curBitmap, 0, 0, 200, 200);
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.
public void GreyScale()
{
ApplySaturation(0.0f);
}
This will alter the saturation of an image. Use a code saturation 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.