Click here to Skip to main content
11,806,818 members (43,185 online)
Click here to Skip to main content

ColorMatrix Basics - Simple Image Color Adjustment

, 2 Apr 2003 CPOL 348.8K 4 89
Rate this:
Please Sign up or sign in to vote.
A beginners guide to using the GDI+ ColorMatrix.

Color Image Grayscale Image Blue Image


This article discusses color operations on digital images, using the new ColorMatrix class provided by GDI+. The ColorMatrix is a welcome addition to the GDI library, especially with the increase in demand of digital imaging applications, as more and more consumer products are made available. This class, as well as many other new GDI classes, provide more control to the developer and reduce dependence on 3rd party applications such as LEAD tools, and others. Some basic knowledge of matrix operations (multiplication, addition, etc), the RGBA colorspace and GDI+ is assumed.


ColorMatrix operations are performed in the RGBA colorspace (red, green, blue, alpha). A ColorMatrix consists of a 5x5 matrix, with color values normalized to 1 for full intensity (255 -> 1.0). You might expect the matrix to be 4x4 ( [R, G, B, A] ), which would be sufficient if we only needed to perform linear transformations (multiplication: scaling, rotation, etc). However, one of the most frequent color manipulations, color adjustment, requires adding color values. This is a non-linear operation, referred to as a translation. Adding a 5th element to the color vector ( [R, G, B, A, w] ) combines these two operations, linear and non-linear, into a single operation called an affine transformation. The 5th element of the color vector is simply a dummy element, always with a value of 1, which only serves to allow a translation (addition) of the color vector.

The example below scales the color vector [255, 128, 102, 255] by .5 and then adds a value of 26 to the R, G and B components, leaving the A component at full intensity. Remember that the component values are normalized, with full intensity, 255, equal to 1.0 (values have been rounded to the nearest tenth). Also notice the addition of the 5th element to the color vector, which is simply ignored in the resultant color vector.

This takes the color and transforms it to .

Now that we've covered the basic principle of the ColorMatrix and it's operations on color vectors, we can start exploring some practical uses.

Applying the code

Applying a ColorMatrix to an image is quite simple. You must first associate a ColorMatrix object with an ImageAttributes object. Then you simply pass the ImageAttributes object as a parameter to the Graphics.DrawImage method.

Color adjustment is one of the more common color operations applied to digital images. The code to do this might look as follows:

Public Function translate(ByVal img As Image, ByVal red As Single, _
                       ByVal green As Single, ByVal blue As Single, _
                       Optional ByVal alpha As Single = 0) As Boolean

    Dim sr, sg, sb, sa As Single
    ' noramlize the color components to 1
    sr = red / 255
    sg = green / 255
    sb = blue / 255
    sa = alpha / 255
    ' create the color matrix
    dim New ColorMatrix(New Single()() _
                       {New Single() {1, 0, 0, 0, 0}, _
                        New Single() {0, 1, 0, 0, 0}, _
                        New Single() {0, 0, 1, 0, 0}, _
                        New Single() {0, 0, 0, 1, 0}, _
                        New Single() {sr, sg, sb, sa, 1}})

    ' apply the matrix to the image
    Return draw_adjusted_image(img, cm)

End Function
Private Function draw_adjusted_image(ByVal img As Image, _
                ByVal cm As ColorMatrix) As Boolean

        Dim bmp As New Bitmap(img) ' create a copy of the source image 
        Dim imgattr As New ImageAttributes()
        Dim rc As New Rectangle(0, 0, img.Width, img.Height)
        Dim g As Graphics = Graphics.FromImage(img)

        ' associate the ColorMatrix object with an ImageAttributes object

        ' draw the copy of the source image back over the original image, 
        'applying the ColorMatrix
        g.DrawImage(bmp, rc, 0, 0, img.Width, img.Height, _
                               GraphicsUnit.Pixel, imgattr)


        Return True

        Return False
    End Try

End Function

Conversion to grayscale is another common conversion. Grayscale values are determined by calculating the luminosity of a color, which is a weighted average of the R, G and B color components. The average is weighted according to the sensitivity of the human eye to each color component. The weights used here are as given by the NTSC (North America Television Standards Committee) and are widely accepted.

Public Function grayscale(ByVal img As Image) As Boolean

    Dim cm As ColorMatrix = New ColorMatrix(New Single()() _
                           {New Single() {0.299, 0.299, 0.299, 0, 0}, _
                            New Single() {0.587, 0.587, 0.587, 0, 0}, _
                            New Single() {0.114, 0.114, 0.114, 0, 0}, _
                            New Single() {0, 0, 0, 1, 0}, _
                            New Single() {0, 0, 0, 0, 1}})

    Return draw_adjusted_image(img, cm)
End Function

The code below creates a digital negative:

Public Function negative(ByVal img As Image) As Boolean

    Dim cm As ColorMatrix = New ColorMatrix(New Single()() _
                           {New Single() {-1, 0, 0, 0, 0}, _
                            New Single() {0, -1, 0, 0, 0}, _
                            New Single() {0, 0, -1, 0, 0}, _
                            New Single() {0, 0, 0, 1, 0}, _
                            New Single() {0, 0, 0, 0, 1}})

    Return draw_adjusted_image(img, cm)

End Function

Color channel separations, alpha transparency adjustment, image toning (Sepia, etc) are just a few more common operations that can be easily performed with a ColorMatrix.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Michael Combs
United States United States
Michael has been developing software for about 19 years primarily in C#, C/C++, Fortran, and Visual Basic. His previous experience includes Internet data services (communication protocols, data storage and GIS) for the mortgage industry, oil platform instrumentation and explosives simulation and testing. He holds a B.S. in astrophysics and computer science. He is currently working for Global Software in Oklahoma City developing law enforcement and emergency services related software.

You may also be interested in...

Comments and Discussions

GeneralMy Vote 5. Pin
Nathan Ferreira4-Dec-14 0:20
memberNathan Ferreira4-Dec-14 0:20 
GeneralMy vote of 1 Pin
Xmen W.K.6-Jul-10 3:01
memberXmen W.K.6-Jul-10 3:01 
GeneralMy vote of 4 Pin
joerg-schumann29-Jun-10 1:46
memberjoerg-schumann29-Jun-10 1:46 
GeneralI have an error "A Graphics object cannot be created from an image that has an index" Pin
rpiniones7-Apr-10 0:46
memberrpiniones7-Apr-10 0:46 
Questionaspx file ? How to call in a page to see resluts ? Pin
Alain Van haecke9-Jul-09 3:00
memberAlain Van haecke9-Jul-09 3:00 
GeneralColorize Image Pin
danielku1531-May-09 9:46
memberdanielku1531-May-09 9:46 
GeneralSub OffsetMatrix incorrect Pin
Thomas Nichols17-Mar-09 6:19
memberThomas Nichols17-Mar-09 6:19 
AnswerAlpha Channel Bug Pin
Andy Davies27-Feb-09 22:09
memberAndy Davies27-Feb-09 22:09 
GeneralMethod for producing a "Color Match"? [modified] Pin
Michael Schäuble21-Sep-08 3:29
memberMichael Schäuble21-Sep-08 3:29 
QuestionPure Black and White [modified] Pin
Luca Crisi, MCP22-May-08 23:44
memberLuca Crisi, MCP22-May-08 23:44 
AnswerRe: Pure Black and White [modified] Pin
Luca Crisi, MCP23-May-08 2:19
memberLuca Crisi, MCP23-May-08 2:19 
GeneralRe: Pure Black and White Pin
Aamir Mustafa9-Oct-08 17:43
memberAamir Mustafa9-Oct-08 17:43 
GeneralRe: Pure Black and White Pin
Luca Crisi, MCP13-Oct-08 8:27
memberLuca Crisi, MCP13-Oct-08 8:27 
QuestionSaving Changed Image Format Pin
stixoffire19-Sep-07 0:16
memberstixoffire19-Sep-07 0:16 
QuestionHow to Apply Pin
*shona13-Aug-07 0:53
member*shona13-Aug-07 0:53 
QuestionHow to do softlight on an image? Pin
freecoke12-Apr-07 6:41
memberfreecoke12-Apr-07 6:41 
QuestionSave File [modified] Pin
CarlHackman11-Mar-07 13:22
memberCarlHackman11-Mar-07 13:22 
Questionabaout grayscale Pin
aimaniez10-Mar-07 13:22
memberaimaniez10-Mar-07 13:22 
GeneralUnderstanding The Matrix Pin
JonFrost25-Nov-06 23:32
memberJonFrost25-Nov-06 23:32 
QuestionColoring a grayscale image Pin
kspaun28-Sep-06 2:17
memberkspaun28-Sep-06 2:17 
AnswerRe: Coloring a grayscale image Pin
thefellow3j3-Feb-07 20:32
memberthefellow3j3-Feb-07 20:32 
Questionhow to do sharpness and blur [modified] Pin
singam17-Jul-06 3:35
membersingam17-Jul-06 3:35 
AnswerRe: how to do sharpness and blur [modified] Pin
wlh21cn19-Jul-06 23:44
memberwlh21cn19-Jul-06 23:44 
GeneralStrange bug while printing Pin
Pugwash200410-May-06 0:23
memberPugwash200410-May-06 0:23 
GeneralComplete Grayscale Class Pin
Anonymous3-May-05 10:49
sussAnonymous3-May-05 10:49 
QuestionHow about 256-colored pictures Pin
offslinker16-Apr-05 21:41
memberoffslinker16-Apr-05 21:41 
AnswerRe: How about 256-colored pictures [modified] Pin
Luca Crisi, MCP23-May-08 2:30
memberLuca Crisi, MCP23-May-08 2:30 
GeneralHue, Saturation and Brightness... Pin
AndrewVos1-Apr-05 1:30
memberAndrewVos1-Apr-05 1:30 
GeneralRe: Hue, Saturation and Brightness... Pin
headspin30-Jan-06 8:45
memberheadspin30-Jan-06 8:45 
QuestionRe: Hue, Saturation and Brightness... Pin
codepunk9-Feb-06 12:29
membercodepunk9-Feb-06 12:29 
AnswerRe: Hue, Saturation and Brightness... Pin
headspin9-Feb-06 14:11
memberheadspin9-Feb-06 14:11 
GeneralRe: Hue, Saturation and Brightness... Pin
Thomas Nichols17-Mar-09 6:29
memberThomas Nichols17-Mar-09 6:29 
GeneralTranslucent Example Pin
Anonymous19-Mar-05 2:20
sussAnonymous19-Mar-05 2:20 
GeneralWhy doi get an error Pin
BigBertB4-Mar-05 1:47
memberBigBertB4-Mar-05 1:47 
GeneralRe: Why do i get an error Pin
Olaf.Rabbachin19-Mar-05 7:03
memberOlaf.Rabbachin19-Mar-05 7:03 
GeneralRe: Why do i get an error Pin
speqter19-Jul-07 20:29
memberspeqter19-Jul-07 20:29 
GeneralWow! Pin
K.h.e.o.p.s14-Dec-04 9:25
memberK.h.e.o.p.s14-Dec-04 9:25 
GeneralYeah, fine... Pin
Anonymous15-Jun-04 21:31
sussAnonymous15-Jun-04 21:31 
GeneralNegative matrix correction Pin
Konstantin Vasserman20-Nov-03 16:39
memberKonstantin Vasserman20-Nov-03 16:39 
GeneralRe: Negative matrix correction Pin
Anthony Queen24-May-06 5:37
memberAnthony Queen24-May-06 5:37 
GeneralRe: Negative matrix correction Pin
MikeDC18-Sep-06 19:04
memberMikeDC18-Sep-06 19:04 
GeneralSaving the new changed image Pin
Qaiser_Awan21-Oct-03 0:03
memberQaiser_Awan21-Oct-03 0:03 
GeneralRe: Saving the new changed image Pin
Michael Combs21-Oct-03 4:20
memberMichael Combs21-Oct-03 4:20 
GeneralRe: Saving the new changed image Pin
Qaiser_Awan22-Oct-03 21:40
memberQaiser_Awan22-Oct-03 21:40 
GeneralRe: Saving the new changed image Pin
thefellow3j3-Feb-07 20:36
memberthefellow3j3-Feb-07 20:36 
Generalavg rgb values Pin
wiseleyb1-Jul-03 13:25
memberwiseleyb1-Jul-03 13:25 
GeneralRe: avg rgb values Pin
Michael Combs2-Jul-03 4:50
memberMichael Combs2-Jul-03 4:50 
GeneralRe: avg rgb values Pin
MikeDC28-Sep-06 2:38
memberMikeDC28-Sep-06 2:38 
GeneralImage Manipulation Pin
tantang1215-Jun-03 18:20
susstantang1215-Jun-03 18:20 
GeneralRe: Image Manipulation Pin
Anonymous27-Aug-03 21:34
sussAnonymous27-Aug-03 21:34 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.151002.1 | Last Updated 3 Apr 2003
Article Copyright 2003 by Michael Combs
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid