RGB to Hexadecimal to HSV conversion in AS3
Posted: April 13th, 2009 | Author: John del Rosario | Filed under: AS 3.0, Programming and Development | Tags: AS3, Tutorials | 3 Comments »In my previous post, I needed to do a lot of conversion between different representations of color. I think a post on how to convert color would be useful.
private function RGBToHex(r:uint, g:uint, b:uint):uint{
var hex:uint = (r << 16 | g << 8 | b);
return hex;
}
private function HexToRGB(hex:uint):Array{
var rgb:Array = [];
var r:uint = hex >> 16 & 0xFF;
var g:uint = hex >> 8 & 0xFF;
var b:uint = hex & 0xFF;
rgb.push(r, g, b);
return rgb;
}
private function RGBtoHSV(r:uint, g:uint, b:uint):Array{
var max:uint = Math.max(r, g, b);
var min:uint = Math.min(r, g, b);
var hue:Number = 0;
var saturation:Number = 0;
var value:Number = 0;
var hsv:Array = [];
//get Hue
if(max == min){
hue = 0;
}else if(max == r){
hue = (60 * (g-b) / (max-min) + 360) % 360;
}else if(max == g){
hue = (60 * (b-r) / (max-min) + 120);
}else if(max == b){
hue = (60 * (r-g) / (max-min) + 240);
}
//get Value
value = max;
//get Saturation
if(max == 0){
saturation = 0;
}else{
saturation = (max - min) / max;
}
hsv = [Math.round(hue), Math.round(saturation * 100), Math.round(value / 255 * 100)];
return hsv;
}
private function HSVtoRGB(h:Number, s:Number, v:Number):Array{
var r:Number = 0;
var g:Number = 0;
var b:Number = 0;
var rgb:Array = [];
var tempS:Number = s / 100;
var tempV:Number = v / 100;
var hi:int = Math.floor(h/60) % 6;
var f:Number = h/60 - Math.floor(h/60);
var p:Number = (tempV * (1 - tempS));
var q:Number = (tempV * (1 - f * tempS));
var t:Number = (tempV * (1 - (1 - f) * tempS));
switch(hi){
case 0: r = tempV; g = t; b = p; break;
case 1: r = q; g = tempV; b = p; break;
case 2: r = p; g = tempV; b = t; break;
case 3: r = p; g = q; b = tempV; break;
case 4: r = t; g = p; b = tempV; break;
case 5: r = tempV; g = p; b = q; break;
}
rgb = [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
return rgb;
}
The code above requires and returns:
- RGB values between 0 to 255
- Hexadecimal in RRGGBB format
- Hue values between 0 to 360
- Saturation and Value between 0 to 100
Notice that the “middleman” is RGB.
And, just in case you only have the Hexadecimal string to work with, here is the code to convert that string into a usable decimal value.
private function HexToDeci(hex:String):uint{
var deci:uint = 0;
var power:uint = hex.length - 1;
for(var i:uint = 0; i < hex.length; i++){
var char:String = hex.charAt(i);
if(parseInt(char) >= 0 && parseInt(char) <= 9){
deci += parseInt(char) * Math.pow(16, power);
}else{
switch(char){
case "A": case "a": deci += 10 * Math.pow(16, power); break;
case "B": case "b": deci += 11 * Math.pow(16, power); break;
case "C": case "c": deci += 12 * Math.pow(16, power); break;
case "D": case "d": deci += 13 * Math.pow(16, power); break;
case "E": case "e": deci += 14 * Math.pow(16, power); break;
case "F": case "f": deci += 15 * Math.pow(16, power); break;
}
}
power --;
}
return deci;
}
EDIT: I’ve just gathered that there is a much much simpler way to convert a Hexadecimal string into a usable number. I feel kind of stupid right now.
private function HexToDeci(hex:String):uint{
if (hex.substr(0, 2) != "0x") {
hex = "0x" + hex;
}
return new uint(hex);
}
[...] RGB to Hexadecimal to HSV conversion in AS3 http://blog.mindfock.com/rgb-to-hexadecimal-to-hsv-conve... [...]
FYI the proper way to to implement HexToDeci would be
private function HexToDeci(hex:String):uint{
return parseInt(hex, 16)
}
Cool. Thanks for the tip!