  Advertiser Disclosure
 TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK Specialized Dev Zones Research Center eBook Library .NET Java C++ Web Dev Architecture Database Security Open Source Enterprise Mobile Special Reports 10-Minute Solutions DevXtra Blogs Slideshow     Home » Tip Bank » Visual Basic » Algorithms
Language: Visual Basic Classic (6 and earlier)
Expertise: Intermediate
May 5, 2009

# Algorithm to Switch Between RGB and HSB Color Values

First, declare some types:

``````Type RGBColor
Red As Byte
Green As Byte
Blue As Byte
End Type

Type HSBColor
Hue As Double
Saturation As Double
Brightness As Double
End Type``````

Next, here's a brief pseudocode explanation of the procedure used by the RGB-to-HSB algorithm:

``````
Set a Delta variable equal to [Max(r,g,b) - Min(r,g,b)]
* Then Brightness = Max(r,g,b) * 100 / 255
* If the color is (00,00,00) (black), then Saturation = 0, and h = -1; otherwise:
Saturation = 255 * Delta / Max(r,g,b)
Case Max(r,g,b) is equal to the value of
+ Red : Set h = (Green - Blue) / Delta
+ Green : h = 2 + (Blue - Red) / Delta
+ Blue : h = 4 + (Red - Green) / Delta
* Hue = h * 60 , if h small then 0 , we have Hue = h + 360``````

Now, here's the VB code for the RGB-to-HSB conversion:

``````Function RGBToHSB(rgb As RGBColor) As HSBColor
Dim minRGB, maxRGB, Delta As Double
Dim h, s, b As Double
h = 0
minRGB = Min(Min(rgb.Red, rgb.Green), rgb.Blue)
maxRGB = Max(Max(rgb.Red, rgb.Green), rgb.Blue)
Delta = (maxRGB - minRGB)
b = maxRGB
If (maxRGB <> 0) Then
s = 255 * Delta / maxRGB
Else
s = 0
End If
If (s <> 0) Then
If rgb.Red = maxRGB Then
h = (CDbl(rgb.Green) - CDbl(rgb.Blue)) / Delta
Else
If rgb.Green = maxRGB Then
h = 2 + (CDbl(rgb.Blue) - CDbl(rgb.Red)) / Delta
Else
If rgb.Blue = maxRGB Then
h = 4 + (CDbl(rgb.Red) - CDbl(rgb.Green)) / Delta
End If
End If
End If
Else
h = -1
End If
h = h * 60
If h < 0 Then h = h + 360
RGBToHSB.Hue = h
RGBToHSB.Saturation = s * 100 / 255
RGBToHSB.Brightness = b * 100 / 255
End Function``````
Of course, you also need to go the other direction, changing from HSB to RGB. Note that:
1. When Max = Red, abs((Green - Blue) / Delta) is always smaller than 1, or -1 < (Green - Blue) / Delta.
2. When Max = Green, abs((Blue - Red) / Delta) is always smaller than 1, or 1 < 2 + (Blue - Red) / Delta <3.
3. When Max = Blue, abs((Red - Green) / Delta) is always smaller than 1, or 3 < 4 + (Red - Green) / Delta <5.

So, in pseudocode, the procedure is:

``````Set h = Hue / 60
* Then s = Saturation * 255 / 100
* And b = Brightness * 255 / 100
* Max(r,g,b) will equal b.
* If s = 0  then the color is black (00,00,00), otherwise:
- Set Delta = s * Max(r,g,b) / 255
- Compare the value of h with 3,1,-1 in turn to find out the Values of Red, Green and Blue.``````

In VB6, the HSB-to-RGB algorithm looks like this:

``````Function HSBToRGB(hsb As HSBColor) As RGBColor
Dim maxRGB, Delta As Double
Dim h, s, b As Double
h = hsb.Hue / 60
s = hsb.Saturation * 255 / 100
b = hsb.Brightness * 255 / 100
maxRGB = b
If s = 0 Then
HSBToRGB.Red = 0
HSBToRGB.Green = 0
HSBToRGB.Blue = 0
Else
Delta = s * maxRGB / 255
If h > 3 Then
HSBToRGB.Blue = CByte(Round(maxRGB))
If h > 4 Then
HSBToRGB.Green = CByte(Round(maxRGB - Delta))
HSBToRGB.Red = CByte(Round((h - 4) * Delta)) + HSBToRGB.Green
Else
HSBToRGB.Red = CByte(Round(maxRGB - Delta))
HSBToRGB.Green = CByte(HSBToRGB.Red - Round((h - 4) * Delta))
End If
Else
If h > 1 Then
HSBToRGB.Green = CByte(Round(maxRGB))
If h > 2 Then
HSBToRGB.Red = CByte(Round(maxRGB - Delta))
HSBToRGB.Blue = CByte(Round((h - 2) * Delta)) + HSBToRGB.Red
Else
HSBToRGB.Blue = CByte(Round(maxRGB - Delta))
HSBToRGB.Red = CByte(HSBToRGB.Blue - Round((h - 2) * Delta))
End If
Else
If h > -1 Then
HSBToRGB.Red = CByte(Round(maxRGB))
If h > 0 Then
HSBToRGB.Blue = CByte(Round(maxRGB - Delta))
HSBToRGB.Green = CByte(Round(h * Delta)) + HSBToRGB.Blue
Else
HSBToRGB.Green = CByte(Round(maxRGB - Delta))
HSBToRGB.Blue = CByte(HSBToRGB.Green - Round(h * Delta))
End If
End If
End If
End If
End If
End Function``````
Duc Nguyen Submit a Tip Browse "Visual Basic" Tips Browse All Tips   Thanks for your registration, follow us on our social networks to keep up-to-date