1

as3でrgbをhsvに変換しようとしています。私は白色(255,255,255)を除いてうまくいくと思われる機能を持っています

これは私の機能です:

        public function RgbToHsv(red:Number, grn:Number, blu:Number):Object
    {
        var x, val, f, i, hue, sat, val;
        red/=255;
        grn/=255;
        blu/=255;
        x = Math.min(Math.min(red, grn), blu);
        val = Math.max(Math.max(red, grn), blu);
        if (x==val){
            return({h:undefined, s:0, v:val*100});
        }
        f = (red == x) ? grn-blu : ((grn == x) ? blu-red : red-grn);
        i = (red == x) ? 3 : ((grn == x) ? 5 : 1);
        hue = Math.floor((i-f/(val-x))*60)%360;
        sat = Math.floor(((val-x)/val)*100);
        val = Math.floor(val*100);
        return({h:hue, s:sat, v:val});
    }       

問題は、白い rgb (255,255,255) を渡すと、次のようになることです: h:null,s:0,v:100

4

2 に答える 2

2

値が白の場合、色相をゼロで割っています。

val = Math.max(Math.max(red, grn), blu) = Math.max( Math.max( 255, 255 ), 255 ) = 255;
x = Math.min(Math.min(red, grn), blu) = Math.min(Math.min(255, 255), 255) = 255;
val - x = 255 - 255 = 0;
hue = Math.floor(( i - f / ( val - x )) * 60) % 360;

x / 0AS3 (およびほとんどの言語) ではNaN(オブジェクトを入力していないため、この場合は null です。AS3 は厳密なデータ型言語です。すべてのオブジェクトを入力する必要があります)。

この 18 か月間、カラー理論やカラー アルゴリズムを使用する必要がなかったので、問題を解決する方法はわかりませんが、それが問題であることは間違いありません。色相は実際には/ になりますNaN/nullこの理由から、赤、緑、青の等しい部分の色があるたびに (白だけでなく、グレースケールの色でも同じ問題が発生するはずです)

于 2013-10-02T16:29:25.070 に答える
1

解決策は非常に簡単です。Josh は良い見解を示しているので、次の行を単純に変更しました。

if (x==val){
    return({h:undefined, s:0, v:val*100});
}

if (x==val){
    return({h:0, s:0, v:val*100});
}
于 2013-10-03T09:34:49.040 に答える