HSVColor - RGB〜HSV色空間の相互変換クラス(ActionScript 3.0)
<<
作成日時 : 2009/05/24 23:18
>>
ブログ気持玉 5 /
トラックバック 0 /
コメント 0
この週末は、ActionScript 3.0 を書いてます。
HSV色空間 を扱うためのクラスを書きました。
RGB←→HSV(円柱)の相互変換のメソッド fromRGB()、toRGB() があります。
出し入れする RGB の値は、uint 型です。
HSV の値はプロパティを読み書きしてください。(Number 型)
値の範囲は、0≦H<360、0≦S≦1、0≦V≦1 です。
ご自由にお使いください。
class HSVColor extends Object {
public var h:Number = 0.0;
public var s:Number = 0.0;
public var v:Number = 0.0;
public function fromHSV (h:Number, s:Number, v:Number):void {
if ( h < 0.0 ) {
h += (Math.floor( -h / 360.0 )+1.0) * 360.0;
}
h = h % 360.0;
s = Math.max(0.0, Math.min(1.0, s));
v = Math.max(0.0, Math.min(1.0, v));
this.h = h;
this.s = s;
this.v = v;
}
public function fromRGB (rgb:uint):void {
var r:uint = (rgb >> 16) & 255;
var g:uint = (rgb >> 8) & 255;
var b:uint = rgb & 255;
var max:Number = Math.max(Math.max(r, g), b);
var min:Number = Math.min(Math.min(r, g), b);
var dif:Number = max - min;
if ( max == 0 ) {
h = 0;
s = 0;
} else {
if ( r >= g && r > b ) {
h = 60.0 * (g - b) / dif;
} else if ( g >= b && g > r ) {
h = 60.0 * (b - r) / dif + 120.0;
} else if ( b >= r && b > g ) {
h = 60.0 * (r - g) / dif + 240.0;
}
if ( h < 0.0 ) h += 360.0;
h = h % 360.0;
s = dif / max;
}
v = max / 255;
}
public function toRGB ():uint {
var rgb:uint = 0;
var hi:uint = Math.floor(h / 60.0) % 6;
var f:Number = h / 60.0 - hi;
var vv:uint = Math.round(255 * v);
var pp:uint = Math.round(255 * v * ( 1 - s ));
var qq:uint = Math.round(255 * v * ( 1 - f * s ));
var tt:uint = Math.round(255 * v * ( 1 - (1 - f) * s ));
if ( vv > 255 ) vv = 255;
if ( pp > 255 ) pp = 255;
if ( qq > 255 ) qq = 255;
if ( tt > 255 ) tt = 255;
switch (hi) {
case 0: rgb = (vv << 16) | (tt << 8) | pp; break;
case 1: rgb = (qq << 16) | (vv << 8) | pp; break;
case 2: rgb = (pp << 16) | (vv << 8) | tt; break;
case 3: rgb = (pp << 16) | (qq << 8) | vv; break;
case 4: rgb = (tt << 16) | (pp << 8) | vv; break;
case 5: rgb = (vv << 16) | (pp << 8) | qq; break;
}
return rgb;
}
}
変換処理の式は、Wikipedia の記述を参考にして書きました。
(2009.05.26追記:Vの値の範囲が0〜255になっていたので修正しました)
(2009.05.31追記:Math.roundにして、RGB〜HSV〜RGBの往復変換を強化しました)
ネット上にもいくつか変換関数が公開されていますね。
これまで、さんざん山ほど書かれてきたであろうコード。w
後になって気づいたが、org.libspark.utils.ColorUtil にもありますね。こちらは Apache ライセンス。
|