1

我正在尝试将 rgb 转换为 as3 中的 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 / 0在 AS3(和大多数语言)中是NaN(或在这种情况下为 null,因为您没有键入对象。AS3 是一种严格的数据类型语言。必须键入每个对象)。

我不确定如何解决这个问题,因为我在 18 个月内不必使用颜色理论或颜色算法,但这绝对是问题所在。出于这个原因,每次你有一个具有相等部分的红色、绿色和蓝色的颜色时,色调实际上都会是NaN/ (所以不仅仅是白色。任何灰度颜色都应该导致相同的问题)null

于 2013-10-02T16:29:25.070 回答
1

解决方案非常简单。乔希给出了一个很好的观点,所以我只是改变了这一行:

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 回答