首页 > 代码库 > ActionScript3游戏中的图像编程(连载十七)

ActionScript3游戏中的图像编程(连载十七)

1.3.3 HSB与RGB之间的互转公式及HSL和HSV对色彩属性理解的异同

        首先,HSL和HSV对H的定义一致,公式如下:

      

        max=min意味着R,G,B三个值始终相等,只能是白,灰,黑这三类颜色了,色相值在这种情况下没有任何意义,所以让它等于0。

        然后,HSB模式将色相环等分成三个120度的区间(图 1.28)。

图 1.28色相环的区间分布


         [0,60]U[300,360]为红色区间,[60,180]为绿色区间,[180,300]为蓝色区间。判断RGB颜色的H值位于哪个颜色区间也非常简单,只要看哪个通道反射的色光最大即可。红色被划分到了两侧,所以当色相位于红色区间时要多加一个条件,但它并不复杂,因为H轴本身是环状结构,左侧跟右侧实际上是重合的,所以这一步的判断仅仅是为了将计算出来的角度标准化了一下,使它落在[0, 360]的区间内而不至于出现负数。因此当max=r时,公式可以合并如下:

        (60*(g-b)/(max-min)+360)%360。

        但是写程序的时候一般都还是用判断来处理,因为取余数的执行效率比较差。

        然后看看HSL里面的L和S的计算方法:

       


        可见,只有max和min都取到通道的最大值,即要求R=G=B=255时,亮度才达到最大,换而言之,HSL模式里,只有白色才是亮度最大的,这跟HSL的色彩空间示意图不谋而合。

        max=min or l=0意味着R=G=B,这时候的颜色只有白,灰,黑,自然就没有饱和度了。

        而HSV中V和S的计算公式如下:

       

       

        作为物理意义是亮度的V,它达到最大值的要求比HSL模式低,RGB三个通道中只要有一个取到了255,亮度就达到最大值。这样的差异,可能导致两种颜色的明暗差异在不同的模式描述下出现不同的结果。即颜色A和颜色B出现 L(A)>L(B),但是V(A)<V(B)的现象。

        饱和度为0的定义,两种模式没有差别,而饱和度的计算规则,也都以R,G,B通道值的差作为主要的决定因素,然后除以亮度来对结果进行标准化。然后,因为亮度计算的差异,L的色彩变化范围比V要大一倍,所以HSL模式的除数必须等于亮度的2倍才可以抵消,加上较明亮的颜色,HSV和HSL在饱和度方面没有达成共识,HSL模式的S公式就要写成分段函数了。

        而HSV/HSL转RGB则是RGB转HSV/HSL的逆运算,虽然在一些极端条件下,这种运算并不可逆,但是放心,这些问题不会影响到您对色彩的使用。

        比如H250,S60,L100和H300,S50,L100,转到RGB都是R255,G255,B255,这时候转回HSL就是H0,S0,L100,值是变了,不过结果值始终都是白色。这跟地球在极点位置的经纬度处理非常相似。