笔记:Actionscript的色彩合成与获取

色彩合成 

如何将红、绿、蓝三种颜色值组成一个有效的颜色值,这是个普遍的问题。假设有三个变量 red,green,blue,每个变量里面保存一个 0 到 255 之间的数。下面是这个公式:

 color24 = red << 16 | green << 8 | blue; 

加入透明度后,建立一个32位色彩值,公式如下: 

color32 = alpha << 24 | red << 16 | green << 8 | blue; 

这里用到了两个位操作符,大家以前可能没有接触过。位操作是对二进制(0或1)进行的操作,对于 24 位色来说,如果把颜色值的每一位都列出来,就会得到一串由 24 个 0 或 1 组成的字串。把十六进制 0xRRGGBB 分解成二进制后是这样的:

RRRRRRRRGGGGGGGGBBBBBBBB

我们看到有 8 位red,8 位green,8 位blue,也就是说 8 位二进制数等于 256。 在色彩合成公式中,第一个位操作符是 << ,是一个按位左移操作符,该操作是将二进制数值向左侧移动。比如,红色值(red)为 0xFF 或 255,可以由二进制表示为:11111111将它向左移动 16 位,结果是:

111111110000000000000000

在 24 位色彩中,它表示红色,转换为二进制后为 0xFF0000,是纯红色。 下面,假设有一个绿色值(green)为 0x55(十进制 85),二进制表示为:01010101将它向左移动 8 位后,结果为:

000000000101010100000000

这样一来,这 8 位数完全移动到了绿色值的范围。 最后,假设一个蓝色值为 0xF3(十进制 243),二进制表示为:11110011。因为它们都处在蓝色(blue)的范围,所以不需要再去移动它。这样我们总共就拥有了三组数: 

111111110000000000000000 000000000101010100000000 000000000000000011110011 

可以简单地将它们加起来,成为一个24位数,但是,还有一种更好更快的方法:使用或(OR)运算,符号是 | 。它会将两组数的每个二进制位进行比较,如果两个之中有一个数为1,那么结果就为 1,如果两个数都为 0,那么结果就为 0。可以使用或(OR)运算将 red, green, blue 的值相加起来,也可以这么说“如果这个数或这个数或这个数中有一个数等于1,那么结果就为1”。最终结果为:

111111110101010111110011 

将这个数转换为十六进制就等于 0xFF55F3 。当然,我们无法看到这些二进制位,也不会与这些 0 或 1 打交道,只需要学会这种写法: 

var color24:Number = 0xFF << 16 | 0x55 << 8 | 0xF3;

十进制写法是: 

var color24:Number = 255 << 16 | 85 << 8 | 243; 

Flash 并不关心人们使用的是十进制数还是十六进制数。 同样,还可以将 red, green, blue 的值全部转换为十六进制的字符串,然后将它们连接成一条很长的字符串,最后再把它们转换为十六进制数。但是,如果这样做的话会很麻烦,55而且使用字符串操作会非常慢。相反,使用二进制操作是 ActionScript 中最快的运算,因为它们属于低级运算。 对于 32 位数,其实道理也是一样的,加入 8 位 alpha(透明度)通道并将其向左移 24 位。例如,有一组32位数为0xFFFF55F3,将 alpha 值向左移动 24 位,结果如下: 

11111111111111110101010111110011 

前8位数表示透明度,后面的 red, green, blue 值与前面的一样。


获取颜色值 

假如有这样一个数 0xFF55F3,要从中提取 red, green, blue 的值。下面请看公式,首先是 24 位色彩:

red = color24 >> 16; 

green = color24 >> 8 & 0xFF; 

blue = color24 & 0xFF; 

一句句来看。首先,大家也许会猜到 >> 是按位右移运算符,用于将二进制位向右移动。如果这些位向右移动得过多,那么这些数字就会消失,就没有数了。 下面从 red 开始: 

111111110101010111110011

将颜色值向右移动 16 位,结果如下: 

11111111

或是0xFF(255)对于 green,向右移动 8 位,结果如下: 

1111111101010101

这里已经得出了 blue 的值,但是 red 值还留在一旁。这里就是要使用与(And)操作符的地方,与(OR)操作符相同,都是对两组数值的比较,可以这样解释“两个数相比较,如果两个都是1那么结果就为 1,如果其中有一个为 0,那么结果就为 0”。我们把它与 0xFF 进行比较: 

1111111101010101 0000000011111111

因为所有的 red 位的数字都与0相比较,所以它们的结果均为 0,只有当两个数都为1时结果才为 1,所以结果如下: 

0000000001010101 

对于 blue 则不需要执行右移操作,只需要让它和 0xFF 执行与(AND)操作即可。对于 32 位色彩,方法也是相同的,只不过需要一点小小的改动: 

alpha = color32 >> 24; 

red = color32 >> 16 & 0xFF; 

green = color32 >> 8 & 0xFF; 

blue = color32 & 0xFF;

posted @ 2010-09-01 12:40  rock506  阅读(392)  评论(0编辑  收藏  举报