图像处理_二进制位转换
今天学习了rgb三原色以及位运算,来写篇笔记
图像原理:
图像是由
像素点
组成的点矩阵每个像素点可以表达一种颜色(一个颜色方块)
像素的颜色值
R(红)G(绿)B(蓝)每个值的范围是(0-255),所以每个颜色都是1byte
黑色:0,0,0
白色:255,255,255
红色:255,0,0
二进制:
1个bit有两种取值: 0/1
1int = 4byte = 32bit
现在我们的要求是要存储这三原色,如果用三个数组的话感觉太过麻烦,下面我们来介绍一种思想,将3个byte组合成一个int
现在我们举一个例子:
RGB值为(130 210 85)
130: 1000 0010
210: 1101 0010
85 : 0101 0101
1个int是8byte,也就是
0000 0000
0000 0000
0000 0000
0000 0000
那么此RGB( 130 210 85 ) == RGB(8_573_525)
0000 0000
1000 0010
1101 0010
0101 0101 这个大数转换为int等于8,573,525
所以我们可以采用这种方法把RGB三原色3个数值只用1个int存储
这样我们要使用这三原色的时候,我们就可以把int拆开来分别看RGB三原色。
那么怎么分开呢?
Java位移运算符
Java位移运算符
是专门用来进行位(bit)运算的,也就是对二进制的每一个0/1进行运算,主要是左移和右移运算,顾名思义,就是将二进制数整体右移和左移
向右移动二进制位编码: >>
- 高位缺失的会
补符号位
,即正数补0,负数补1,符号位不变低位被挤出去的就丢掉 最后保留的想要的结果无符号右移: >>>
- 高位缺失的会
补0
*,低位被挤出去的就丢掉 最后保留的想要的结果向左移动二进制位编码: <<
- 高位挤出去的丢掉,低位缺失的补0
无符号左移: <<<
与运算
与运算:&
两组二进制码按位比较:
规则: 相同保留源码 不同为0
0010 1001 1111 1010 &
1111 1111 0000 0000 =
0010 1001 0000 0000
现在我们的知识储备已经能够进行int值取出R G B三原色了
上面合并的时候我们讲过,int4字节中R G B分别位于1-8位,9-16位,17-24位,所以我们可以通过移位操作分别取出R G B,只要将它们的值
分别移到最低8位,在与255(11111111)(0xff)相与
(&)=>为了将低8位之外的24个位都置0免得妨碍计算,就可以分别取出
例:
int rgb = 8573525;
int blue = rgb>>0&0xff;
int green = rgb>>8&0xff;
int red = rgb>>16&0xff;
十六进制
十六进制: 0xFF0000
表达十六进制的符号有十六个 0
9+A
F A:10 B:11 C:12 D:13 E:14 F:15
- 每4个bit 用一个符号表达(这也是二进制转十六进制,4个bit分别代表8 4 2 1)
- 例:1101 = 8 * 1+4 * 1+2 * 0+1 * 1=13
表达十进制的符号 有十个 阿拉伯数字 0~9
表达二进制的符号 有两个 0/1
例:0A0E = 0000 1010 0000 1110