Click here to Skip to main content
11,790,613 members (62,610 online)
Click here to Skip to main content

Use both RGB and HSB color schemas in your .NET application using HSBColor class

, 17 Aug 2005 74.6K 1.4K 26
Rate this:
Please Sign up or sign in to vote.
This class helps to convert RGB colors to HSB and back.


.NET Framework provides implementation of the Color class and several satellite classes like KnownColor and SystemColors. But all of them are based on ARGB schema. And this is logical, since Windows itself is based on it. But in many cases ARGB is not very useful. For example, you want to use a color that is slightly brighter than a specific system color. For this kind of manipulation you need a different color coding, like HSB (Hue-Saturation-Brightness).

System.Color class provides us these values, but unfortunately it can’t be recreated using them. The purpose of the class I’m going to present in this article is to provide an ability to convert from RGB to HSB and back.

Here is the signature of the class:

using System;

namespace TTRider.UI
    public struct HSBColor
        public HSBColor(System.Drawing.Color color);
        public HSBColor(float h, float s, float b);
        public HSBColor(int a, float h, float s, float b);
        public int A { get; }
        public float H { get; }
        public float S { get; }
        public float B { get; }
        public System.Drawing.Color Color { get; }
        public static HSBColor FromColor(System.Drawing.Color color);
        public static System.Drawing.Color FromHSB(HSBColor hsbColor);
        public static System.Drawing.Color ShiftBrighness(
                       System.Drawing.Color c, float brightnessDelta);
        public static System.Drawing.Color ShiftHue(
                              System.Drawing.Color c, float hueDelta);
        public static System.Drawing.Color ShiftSaturation(
                       System.Drawing.Color c, float saturationDelta);

As you can see, you can create an instance of this struct using System.Color class or just use the Hue, Saturation and Brightness values.

Be aware! You can't use these values from the Color class. Looks like .NET uses different conversion formulas. The valid range of each component is 0:255. Looks like System.Color uses the range from 0:1 for Brightness and Saturation. There are several helpful static members like ShiftHue, ShiftSaturation and ShiftBrightness to manipulate your System.Color class.

You can look into the implementation of this class in the source files. It is straightforward.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Web Developer
United States United States
No Biography provided

You may also be interested in...

Comments and Discussions

GeneralInfinite hue shift [modified] Pin
Saso Tepina15-Jan-09 6:12
memberSaso Tepina15-Jan-09 6:12 
GeneralWrong Brightening Pin
mephistok15-Oct-07 2:47
membermephistok15-Oct-07 2:47 
AnswerRe: Wrong Brightening Pin
dlk1322-Feb-08 6:49
memberdlk1322-Feb-08 6:49 
QuestionHow to contact the author? Pin
bl.nero14-Jun-06 0:08
memberbl.nero14-Jun-06 0:08 
GeneralAnother Class Pin
Geeky Monkey24-Aug-05 9:11
memberGeeky Monkey24-Aug-05 9:11 
GeneralReminds me of Bob Powell's work Pin
Anonymous23-Aug-05 21:16
sussAnonymous23-Aug-05 21:16 
GeneralFurther reading... Pin
Drew Stainton18-Aug-05 7:13
memberDrew Stainton18-Aug-05 7:13 
GeneralComparing color Pin
Stephane David17-Aug-05 21:43
memberStephane David17-Aug-05 21:43 
GeneralRe: Comparing color Pin
Drew Stainton18-Aug-05 7:24
memberDrew Stainton18-Aug-05 7:24 
GeneralRe: Comparing color Pin
philippe dykmans11-Nov-05 5:15
memberphilippe dykmans11-Nov-05 5:15 

I agree with Drew Stainton. The human eye has flaws that make it perceive colour in unexpected ways. And this makes "natural" automatic colour matching difficult. But there is one approach that is at least "mathematically" correct.

Look at the three colours R, G and B as axes of a 3D space. You could then express the proximity of colours as their mathimatical (Euclidian) distance in this space. Given two colours with respective colour components r1, r2, g1, g2, b1, b2 you would have to calculate:

sqrt((r1 - r2)^2 + ((g1 - g2)^2 + (b1 - b2)^2)

where ^ means power to.

Applying this function 'out of the box' will yield unexpected results. Like one type of brown will be mathematically closer to some distinct purple than to another brown that our eye perceives as an almost identical brown.

My guess is that you should apply a certain weight to every difference factor in the equation to yield more 'natural' results. Maybe start with the relative sensitivity of the human eye for red, green and blue. You can find starting values for those on the net. I'm sure.

Good luck!

Philippe Dykmans
Software developpement
University of Antwerp
Generalinteresting Pin
Ashley van Gerven17-Aug-05 14:30
memberAshley van Gerven17-Aug-05 14:30 
GeneralRe: interesting Pin
TTRider17-Aug-05 14:38
memberTTRider17-Aug-05 14:38 
GeneralRe: interesting Pin
sabrown10025-Oct-07 13:18
membersabrown10025-Oct-07 13:18 

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
Web02 | 2.8.1509028.1 | Last Updated 17 Aug 2005
Article Copyright 2005 by TTRider
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid