Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
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
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap