First, declare some types:
Type RGBColor Red As Byte Green As Byte Blue As ByteEnd TypeType HSBColor Hue As Double Saturation As Double Brightness As DoubleEnd 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 HSBColorDim minRGB, maxRGB, Delta As DoubleDim 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 / 255End Function
Of course, you also need to go the other direction, changing from HSB to RGB.Note that:
- When Max = Red, abs((Green - Blue) / Delta) is always smaller than 1, or -1 < (Green - Blue) / Delta.
- When Max = Green, abs((Blue - Red) / Delta) is always smaller than 1, or 1 < 2 + (Blue - Red) / Delta <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 RGBColorDim maxRGB, Delta As DoubleDim 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 IfEnd Function