Flex uint 使用RGB表示的转换 颜色合成与分解的基本原理[转]

传统的RGB颜色体系中,每一个分量值的范围都是0到255,如果转换为2进制的话最多需要8位(比如:十进制的255变成二进制则为11111111),三个分量加起来,最多需要24位长度的uint来存储.

而通常我们在html中喜欢用16进制比如"#FF0000"来表示红色,即R:255,G:0,B:0,如何高效的从一个表示颜色的unit数字中把这RGB分量提取出来?

当然:最容易想到的是利用字符串拆分,拆成二个二个一组,然后用:

 
var r: uint = parseInt ( "FF" , 16 );
trace (r)


来还原,但是这种方法的效率是很低的,先要转成字符串,再拆分,然后再转为数字。

上面这张图演示了正确做法的原理,同样将已知分量合成为颜色值时,也可以用类似处理,只不过顺序倒过来而已

R分量:先将其左移16位,推到左侧顶端,得到一个包含R分量,其它位置均为0的值

G分量:先将其左移8位,推到中间,得到一个包含G分量,其它位置均为0的值

B分量:不做任何处理

然后将这三个新值,位对位做或运算,只要有值(即1)的部分,就被会保留下来,从而得到新的颜色值。

 
 
var color: uint ;
 
function drawColorRect(r: uint ,g: uint ,b: uint ) {
     //直接用位操作合成颜色
     color=r<< 16 |g<< 8 |b;
     graphics.clear();
     graphics.beginFill(color);
     graphics.drawRect( 49 , 43 , 267 , 150 );
     graphics.endFill();
     
     //lbl1.text = "#" + color.toString(16); 返回16进制的值,不过该值会忽略前导的0
     
     //获取颜色分量
     var r: uint = color>> 16 ;
     var g: uint = color>> 8 & 0xff ;
     var b: uint = color & 0xff ;
     lbl1.text = "16进制分量还原结果,红:" + r.toString( "16" ) + ",绿:" + g.toString( "16" ) + ",蓝:" + b.toString( "16" );
     
}
 
txtR.addEventListener(Event.CHANGE,ChangeHandler);
txtG.addEventListener(Event.CHANGE,ChangeHandler);
txtB.addEventListener(Event.CHANGE,ChangeHandler);
 
function ChangeHandler(e:Event): void {
     drawColorRect(txtR.value,txtG.value,txtB.value);
}
 
drawColorRect(txtR.value,txtG.value,txtB.value);
 
stop();

 

作者: 菩提树下的杨过
出处: http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值