RGB颜色表示方法,red = (rgb & 0x00ff0000) >> 16是什么意思?

RGB颜色是由红(Red)、绿(Green)、蓝(Blue)三原色组成的,所以可以使用这三个颜色的组合来代表一种具体的颜色,其中R、G、B的每个数值都位于0-255之间。在表达颜色的时候,即可以使用三个数字来表达,也可以使用一个格式如0X00RRGGBB这样格式的十六进制来表达,下面是常见颜色的表达形式:

  红色:(255,0,0)或0x00FF0000

  绿色:(0,255,0)或0x0000FF00

  蓝色:(255,255,255)或0x00FFFFFF 

在编写Android彩色图像处理程序时,需要对图像进行灰度化和二值化处理,很多地方不懂,在借鉴别人的代码是看到这样的表示:

red = (rgb & 0x00ff0000) >> 16;
首先将颜色值与十六进制表示的00ff0000进行“与”运算,运算结果除了表示红色的数字值之外,GGBB部分颜色都为0,在将结果向右移位16位,得到的就是红色值。所以这句代码主要用来从一个颜色中抽取其组成色---红色的值。

int color = 0x0012faff;
例如:我们已经获取一种颜色,如上所示color。那么下面这段代码的结果将会是18,它是0x12的十进制表示值。

int redOnly = color & 0x00ff0000;
System.out.println(redOnly >> 16);
同样的,我们也可以通过以下代码得到green和blue的值:

int green = (color & 0x0000ff00) >> 8; // 250 = 0xfa
int blue = (color & 0x000000ff); // 255 = 0xff


// 定义所有条件参数 [min, max, mod], 用{0}表示终止 const u16 Energy_range[5][9][3] = { { /* vol <=2 / {18000, 65535, 30}, {12000, 18000, 24}, {8000, 12000, 18}, {4000, 8000, 16}, {2000, 4000, 10}, {1000, 2000, 6}, {500, 1000, 4}, {0} }, { / vol <=4 / {20000, 65535, 30}, {15000, 20000, 24}, {10000, 15000, 18}, {5000, 10000, 16}, {2500, 5000, 10}, {1000, 2500, 6}, {500, 1000, 4}, {0} }, { / vol <=8 / {40000, 65535, 30}, {20000, 30000, 24}, {15000, 20000, 18}, {10000, 15000, 20}, {5000, 10000, 10}, {1000, 5000, 6}, {500, 1000, 4}, {0} }, { / vol <=12 / {45000, 65535, 30}, {38000, 45000, 24}, {30000, 38000, 18}, {22000, 30000, 16}, {17000, 22000, 10}, {12000, 17000, 6}, {5000, 12000, 4}, {0} }, { / else */ {55000, 65535, 30}, {50000, 55000, 26}, {45000, 50000, 24}, {40000, 45000, 22}, {35000, 40000, 20}, {30000, 35000, 18}, {25000, 30000, 16}, {20000, 25000, 14}, {15000, 20000, 12} }, }; u32 led_level[4][4]= {//亮红灯1-4个 {0x0000ff00,0,0,0}, {0x0000ff00,0x0000ff00,0,0}, {0x0000ff00,0x0000ff00,0x0000ff00,0}, {0x0000ff00,0x0000ff00,0x0000ff00,0x0000ff00}, }; void rgb_deal(void) { if(bt_nor_is_connected()&&bt_get_status()==BT_STA_PLAYING) { if(sys_cb.energy_timer>=20) {//100ms采集一次 sys_cb.energy_timer=0; power = dac_pcm_pow_calc(); // 获取dac的能量输出 if(sys_cb.lea_role_change&&bt_get_status()==BT_STA_PLAYING) {//音乐分享 power+=17000; } //printf("===================>power: %d====vol: %d==========\n",power,sys_cb.vol); u8 cond_index = 4; // 默认else分支 if (sys_cb.vol <= 2) cond_index = 0; else if (sys_cb.vol <= 4) cond_index = 1; else if (sys_cb.vol <= 8) cond_index = 2; else if (sys_cb.vol <= 12) cond_index = 3; for (u8 i = 0; i < 9; i++) { if (Energy_range[cond_index][i][0] == 0) { power = 0; break; } if (power > Energy_range[cond_index][i][0] && power <= Energy_range[cond_index][i][1]) { power %= Energy_range[cond_index][i][2]; //printf("---------->power: %d %d %d-----111\n",power,sys_cb.vol,cond_index); break; } } if(!power) { for(u8 i=14;i<18;i++) { DATA_BUF[i] = light_off; } }else { //printf("---------->power: %d-----\n",power); if(power>=1&&power<=5) level=0; else if(power>=6&&power<=10) level=1; else if(power>=11&&power<=15) level=2; else if(power>=16&&power<=65535) level=3; //printf("---------->level: %d-----\n",level); for(u8 i=14;i<18;i++) { DATA_BUF[i] = led_level[level][i-14]; } DATA_BUF[18] = Brigh_Green; } } } },优化以上代码,实现律动灯(流水灯效,不能跳变)
06-06
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值