⼆进制和颜⾊
⼀、概述
⽆论怎样的数据,计算机都存储为⼆进制(基数为2)。⼆进制表⽰法只使⽤两个数字——1和0,它们分别代表了两种状态,即真和假,或开与关。例如:10011011是⼀个⼆进制数。但AS3.0并没有提供⼆进制表⽰法来书写数字的⽅式。⼆进制是基于2的幂。
⼆进制⼗进制
10011011=1×27+0×26+0×25+1×24+1×23+0×22+1×21+1×20
=128+0+0+16+8+0+2+1
=155
为什么在计算机中的数据都是⽤⼆进制数存储的呢?因为⼆进制表⽰法与计算机内存完全对应,在内存中,每个单元(位)都可以设置成开或关。只是将关表⽰为0,将开表⽰为1。内存通常是以字节为单位组织的,每个字节包含8位(随着计算机的发展,现在已出现16位、32位字节,将来可以还会有更⾼的发展),字节中的位被编号,对应与相关的2的幂。这样,最右侧的位编号为0,然后是1,以此类推。
⼆、⼆进制和⼗六进制
⼗六进制表⽰法常⽤于提供更为⽅便的⼆进制数(如内存地址或存储位标记设置的整数)视图。可以这样做的原因是,每个⼗六进制位对应于⼆进制(或计算机)的4位。下表列出了这种对应关系:
⼗六进制位对应的⼆进制位
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001
A1010
B1011
C1100
D1101
E1110
F1111
要将⼗六进制转换为⼆进制,只需将每个⼗六进制位替换为相应的⼆进制数即可。例如:0xFF转换为11111111同样,可以轻松的将⼆进制转换为⼗六进制。⽅法是:每4位转换为对应的⼗六进制。例如:10010101转换为0x95。
三、按位运算符
按位运算符对整数值的位进⾏操作。共有6个:<<、>>、~、&、|和^。
1、移位运算符
现在我们先只讨论⽆符号整数的移位,来理解移位的意义。⽅法是:腾出的位置⽤0填充,超出边界的位被丢弃。
例如:13<<3,13向左移3位,如图所⽰:
由于每个位都表⽰右边⼀位的2倍,所以左移⼀位相当于乘以2,左移两位相当于乘以2的2次幂,左移3位相当于乘以2的3次幂,以此类推,向左移动n位就相当于乘以2的n次幂。因此,13<<3的值就是13×23,即104。
再如:17>>2,17向右移2位,如图所⽰:
向右移动⼀位相当于除以2,向右移动n位相当于除以2的n次幂。
移位运算符在AS3.0中不能改变原先变量的值。例如:var i:int=13;trace(i<<3);trace(i);
如果想改变原先变量的值,必须使⽤移位赋值运算符,例如:var i:int=13;trace(i<<=3);trace(i);
在有些系统上,使⽤移位运算符实现将整数乘或除以2的速度⽐使⽤乘(除)法运算符更快,但由于编译器在优化代码⽅⾯越来越好,因此这种差异正在减⼩。
2、逻辑按位运算符
逻辑按位运算符类似于常规的逻辑运算符,只是它们⽤于值的每⼀位,⽽不是整个值。例如:逻辑⾮运算符(!)和位⾮运算符(~),逻辑⾮⽤于将在true和false之间进⾏转换,⽽位⾮则是将每个位上的数在1和0之间进⾏转换。
按位或运算符OR(|),有⼀得1,其余为0。
按位与运算符AND(&),⼀⼀得1 ,其余为0。
按位异或运算符XOR(^),不同为1,其余为0。
按位⾮运算符NOT(~),1为0,0为1。
四、颜⾊
ActionScript3.0中,ARGB颜⾊值正好和uint的值完全相对应,即ARGB颜⾊的最⼤值和uint的最⼤值相
同,都是32位⼆进制数的最⼤值。即⼀共有“uint的最⼤值+1”种ARGB颜⾊。RGB颜⾊相当于去掉透明度的颜⾊值,是24位的。例如:
trace(uint.MAX_VALUE);
trace(0xFFFFFFFF);//把该数复制粘贴到计算器中,转成⼆进制
颜⾊的编码是⼈为的规定。例如:RGB颜⾊,⽩⾊0xFFFFFF,⿊⾊0x000000,红⾊0xFF0000,绿⾊0x00FF00,蓝⾊
0x0000FF,某橙⾊0xE98C27等等。当然⼈们可以⽤语⾔描述的颜⾊种类是⾮常有限的,⾁眼分辨颜⾊的能⼒也是⾮常有限的,只有颜⾊值才能准确的描述某⼀种颜⾊。
1、颜⾊通道
例如:⼀个颜⾊值为0x676fe833,这是⼀个ARGB颜⾊的值,那么颜⾊通道指的就是将代表各个颜⾊的两个⼗六进制位的值剥离出来的值,即0x67为透明度通道值,0x6f为红⾊通道值,0xe8为绿⾊通道值,0x33为蓝⾊通道值。每种通道的最⼤值是0xFF,最⼩值是0x00。那么对于任⼀颜⾊值,怎样将这些通道值剥离出来呢?这就⽤到了⼆进制的位运算。
var color:uint = 0x0FF0F0F0;
var a:uint =    (color & 0xFF000000) >> 24;
var red:uint =  (color & 0x00FF0000) >> 16;
var green:uint =(color & 0x0000FF00) >> 8;
var blue:uint = (color & 0x000000FF);
这样,我们就分别得到了各个颜⾊通道的值。
那么怎么合成⼏个颜⾊通道的值呢?想⼀想。
2、颜⾊变换类ColorTransform
元件变换颜⾊,需要通过颜⾊通道的改变来实现。可使⽤ ColorTransform 类调整显⽰对象的颜⾊通道值。
(在舞台上建⼀个元件,查看它的属性——⾊彩效果——样式——⾼级。这⾥的8个值,正是ColorTransform的8个参数。)
二进制编码转换
当 ColorTransform 对象应⽤于显⽰对象时,将按如下⽅法为每个颜⾊通道计算新值:
新红⾊值 = (旧红⾊值 * redMultiplier) + redOffset
新绿⾊值 = (旧绿⾊值 * greenMultiplier) + greenOffset
新蓝⾊值 = (旧蓝⾊值 * blueMultiplier) + blueOffset
新 Alpha 值 = (旧 Alpha 值 * alphaMultiplier) + alphaOffset
如果计算后任何⼀个颜⾊通道值⼤于 255,则该值将被设置为 255。如果该值⼩于 0,它将被设置为 0。
可以通过下列⽅式使⽤ ColorTransform 对象:
在 BitmapData 类的colorTransform()⽅法的colorTransform参数中
作为 Transform 对象(此对象可以⽤作显⽰对象的transform属性)的colorTransform属性
创建 ColorTransform 对象后,能调⽤ ColorTransform 对象的属性和⽅法。
例如:(创建⼀个圆形影⽚剪辑实例名称为aaa,创建⼀个长⽅形位图BitmapData,类名为BitmaData1
Rectangle;
import flash.display.Bitmap;
ColorTransform;
dMultiplier);
String());
var bitD:BitmapData1=new BitmapData1();
var b:Bitmap=new Bitmap(bitD);
addChild(b);
效果如图:
颜⾊转换不会应⽤于影⽚剪辑(如加载的 SWF 对象)的背景⾊,它们仅应⽤于附加到影⽚剪辑的图形和元件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。