FlashPlatform Algorithm RGB2HSL
来自Blueidea
RGBColor
RGB色彩模型。
package starpulse.geom { /** * RGB色彩。 */ public class RGBColor { //========================================================================== // Constructor //========================================================================== /** * RGB色彩。 * @param r Number - red value [0-255] * @param g Number - green value [0-255] * @param b Number - blue value [0-255] */ public function RGBColor(r:uint = 255, g:uint = 255, b:uint = 255, a:uint = 255) { $a = a; $r = r; $g = g; $b = b; } //========================================================================== // Properties //========================================================================== private var $a:uint; private var $r:uint; private var $g:uint; private var $b:uint; //========================================================================== // Public accessors //========================================================================== /** * @private */ public function set alpha(value:uint):void { $a = value; } /** * 透明通道。 */ public function get alpha():uint { return $a; } /** * @private */ public function set red(value:uint):void { $r = value; } /** * 紅色通道。 */ public function get red():uint { return $r; } /** * @private */ public function set green(value:uint):void { $g = value; } /** * 綠色通道。 */ public function get green():uint { return $g; } /** * @private */ public function set blue(value:uint):void { $b = value; } /** * 蓝色通道。 */ public function get blue():uint { return $b; } /** * @private */ public function set value(v:uint):void { $a = 255; $r = (v >>> 16 << 16) >>> 16; $g = ((v >>> 8 << 8) - ($r << 16)) >>> 8; $b = ((v >>> 0 << 0) - ($r << 16) - ($g << 8)) >>> 0; } /** * 無透明通道顏色值。 */ public function get value():uint { const R1:uint = $r >= 16 ? $r / 16 : 0; const R2:uint = $r >= 16 ? $r % 16 : $r; const G1:uint = $g >= 16 ? $g / 16 : 0; const G2:uint = $g >= 16 ? $g % 16 : $g; const B1:uint = $b >= 16 ? $b / 16 : 0; const B2:uint = $b >= 16 ? $b % 16 : $b; return (R1 << 20) + (R2 << 16) + (G1 << 12) + (G2 << 8) + (B1 << 4) + (B2 << 0); } /** * @private */ public function set value32(v:uint):void { $a = v >>> 24; $r = ((v >>> 16 << 16) - ($a << 24)) >>> 16; $g = ((v >>> 8 << 8) - ($a << 24) - ($r << 16)) >>> 8; $b = ((v >>> 0 << 0) - ($a << 24) - ($r << 16) - ($g << 8)) >>> 0; } /** * 32位4通道顏色值。 */ public function get value32():uint { const A1:uint = $a >= 16 ? $a / 16 : 0; const A2:uint = $a >= 16 ? $a % 16 : $a; const R1:uint = $r >= 16 ? $r / 16 : 0; const R2:uint = $r >= 16 ? $r % 16 : $r; const G1:uint = $g >= 16 ? $g / 16 : 0; const G2:uint = $g >= 16 ? $g % 16 : $g; const B1:uint = $b >= 16 ? $b / 16 : 0; const B2:uint = $b >= 16 ? $b % 16 : $b; return (A1 << 28) + (A2 << 24) + (R1 << 20) + (R2 << 16) + (G1 << 12) + (G2 << 8) + (B1 << 4) + (B2 << 0); } //========================================================================== // Public methods //========================================================================== /** * 設定顏色值為字符串所表示的無透明通道顏色值。<br/> * 例如: * <table> * <tr><th>参数</th></tr> * <tr><td>from("0xFFCC00");</td></tr> * <tr><td>from("23564");</td></tr> * </table> * @param value 表示數值的字符串。 */ public function from(value:String):void { const V:int = int(new Number(value)); $a = 255; $r = (V >>> 16 << 16) >>> 16; $g = ((V >>> 8 << 8) - ($r << 16)) >>> 8; $b = ((V >>> 0 << 0) - ($r << 16) - ($g << 8)) >>> 0; } /** * 設定顏色值為字符串所表示的32位4通道顏色值。<br/> * 例如: * <table> * <tr><th>参数</th></tr> * <tr><td>from32("0xFFFFCC00");</td></tr> * <tr><td>from32("3323564");</td></tr> * </table> * @param value 表示數值的字符串。 */ public function from32(value:String):void { const V:int = int(new Number(value)); $a = V >>> 24; $r = ((V >>> 16 << 16) - ($a << 24)) >>> 16; $g = ((V >>> 8 << 8) - ($a << 24) - ($r << 16)) >>> 8; $b = ((V >>> 0 << 0) - ($a << 24) - ($r << 16) - ($g << 8)) >>> 0; } /** * 無透明通道顏色值的16進制表示。 */ public function toString():String { return "[0x" + value.toString(16).toUpperCase() + "]"; } /** * 32位4通道顏色值的16進制表示。 */ public function toString32():String { return "[0x" + value32.toString(16).toUpperCase() + "]"; } } // <- end class -> }
HSLColor
HSL色彩模型。
package starpulse.geom { /** * RGB色彩。 */ public class HSLColor { //========================================================================== // Constructor //========================================================================== /** * HSL色彩。 * @param h Number - hue value [0-360] * @param s Number - saturation value [0-100] * @param v Number - brightness value [0-100] */ public function HSLColor(h:uint = 360, s:uint = 100, l:uint = 100) { $h = h; $s = s; $l = l; } //========================================================================== // Properties //========================================================================== private var $h:uint; private var $s:uint; private var $l:uint; //========================================================================== // Public accessors //========================================================================== /** * @private */ public function set hue(value:uint):void { $h = value; } /** * 色相。 */ public function get hue():uint { return $h; } /** * @private */ public function set saturation(value:uint):void { $s = value; } /** * 飽和度。 */ public function get saturation():uint { return $s; } /** * @private */ public function set lightness(value:uint):void { $l = value; } /** * 亮度。 */ public function get lightness():uint { return $l; } //========================================================================== // Public methods //========================================================================== public function toString():String { return "[H:" + hue + " S:" + saturation + " L:" + lightness + "]"; } } // <- end class -> }
ColorFormatTransform
色彩模型轉換器。
package starpulse.geom { /** * 顏色格式轉換器。 */ public class ColorFormatTransform { private static const FF:uint = 255; /** * RGB色彩到HSL色彩轉換。 * @param rgb RGB色彩對象。 * @return HSL色彩對象。 */ public static function rgb2hsl(rgb:RGBColor, overwrite:HSLColor = null):HSLColor { const R:Number = rgb.red / 255; const G:Number = rgb.green / 255; const B:Number = rgb.blue / 255; const MIN:Number = Math.min(R, G, B); const MAX:Number = Math.max(R, G, B); const DELTA_MAX:Number = MAX - MIN; const L:Number = MAX; var hue:Number; if(DELTA_MAX == 0) { if(overwrite) { overwrite.hue = 0; overwrite.saturation = 0; overwrite.lightness = L * 100; return overwrite; } else { return new HSLColor(0, 0, L * 100); } } const S:Number = DELTA_MAX / MAX; const DELTA_R:Number = (((MAX - R ) / 6) + (DELTA_MAX / 2)) / DELTA_MAX const DELTA_G:Number = (((MAX - G ) / 6) + (DELTA_MAX / 2)) / DELTA_MAX const DELTA_B:Number = (((MAX - B ) / 6) + (DELTA_MAX / 2)) / DELTA_MAX if(R == MAX) { hue = DELTA_B - DELTA_G; } else if(G == MAX) { hue = ( 1 / 3 ) + DELTA_R - DELTA_B; } else if(B == MAX) { hue = ( 2 / 3 ) + DELTA_G - DELTA_R; } hue = hue < 0 ? hue + 1 : hue > 1 ? hue - 1 : hue; if(overwrite) { overwrite.hue = hue * 360; overwrite.saturation = S * 100; overwrite.lightness = L * 100; return overwrite; } else { return new HSLColor(hue * 360, S * 100, L * 100); } } /** * HSL色彩到RGB色彩轉換。 * @param hsl HSL色彩對象。 * @return RGB色彩對象。 */ public static function hsl2rgb(hsl:HSLColor, overwrite:RGBColor = null):RGBColor { const H:Number = hsl.hue / 360; const S:Number = hsl.saturation / 100; const L:Number = hsl.lightness / 100; var r:uint; var g:uint; var b:uint; if(S == 0) { if(overwrite) { overwrite.red = L * FF; overwrite.green = L * FF; overwrite.blue = L * FF; return overwrite; } else { return new RGBColor(L * FF, L * FF, L * FF); } } else { const VH:Number = H == 1 ? 0 : H * 6; const VI:uint = int(VH); const A:Number = L * (1 - S); const B:Number = L * (1 - S * (VH - VI)); const C:Number = L * (1 - S * (1 - (VH - VI))); if(VI == 0) { r = L * FF; g = C * FF; b = A * FF; } else if (VI == 1) { r = B * FF; g = L * FF; b = A * FF; } else if (VI == 2) { r = A * FF; g = L * FF; b = C * FF; } else if (VI == 3) { r = A * FF; g = B * FF; b = L * FF; } else if (VI == 4) { r = C * FF; g = A * FF; b = L * FF; } else { r = L * FF; g = A * FF; b = B * FF; } if(overwrite) { overwrite.red = r; overwrite.green = g; overwrite.blue = b; return overwrite; } else { return new RGBColor(r, g, b); } } } } // <- end class -> }