Kawanet Blog II

アクセスカウンタ

zoom RSS HSVColor - RGB〜HSV色空間の相互変換クラス(ActionScript 3.0)

<<   作成日時 : 2009/05/24 23:18   >>

ナイス ブログ気持玉 6 / トラックバック 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 ライセンス。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 6
ナイス ナイス ナイス ナイス ナイス
なるほど(納得、参考になった、ヘー)

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
HSVColor - RGB〜HSV色空間の相互変換クラス(ActionScript 3.0) Kawanet Blog II/BIGLOBEウェブリブログ
文字サイズ:       閉じる