教程1:在archlinux上实现rgba:
>android中config下只有
kA1_Config,
kA8_Config,
kIndex8_Config,
kRGB_565_Config,
kARGB_8888_Config这些位图格式!前置色彩基础
RGB色彩空间
RGB色彩空间是工业界的一种颜色标准,RGB是红绿蓝三原色的意思,R(Red)代表红色,G(Green)代表绿色,B(Blue)代表蓝色。
通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
在计算机中一般用一个字节(8位)来表示一个R,一个字节表示G,一个字节表示B,总共占用24位,也就是说,R、G、B的取值都在0-255(2^8-1),之间,总共可以表示16777216(2^24)中颜色。
任意一种色光F都可以用不同比例的R、G、B三色相加混合而成。
```alg
<!-- pr、pg、pb分别为三基色参与混合的系数 -->
F = pr [ R ] + pg [ G ] + pb [ B ]
```
当三原色比例都为0(最弱)时混合为黑色光
当三原色分量都为255(最强)时混合为白色光
调整pr、pg、pb三个系数的值,可以混合出介于黑色光和白色光之间的各种各样的色光
YUV颜色空间
YUV也是一种颜色空间,基于YUV的颜色编码是流媒体的常用编码方式。Y表示亮度,UV确认其彩度。
采用YUV色彩空间重要的是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。
YCbCr
YCbCr是YUV经过缩放和偏移翻版,只是在表示方法上不同而已。其中Y与YUV中的Y含义一致,是指亮度分量,Cb,Cr同样都指色彩,C代表颜色,b代表蓝色,r代表红色,Cb指蓝色色度分量,而Cr指红色色度分量。
YCbCr主要用于数字图像领域,YUV主要用于模拟信号领域,MPEG、DVD、摄像机中常说的YUV其实是YCbCr,二者转换为RGBA的转换矩阵是不同的。
在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD摄像机进行摄像,然后把摄得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号RY(即U)、BY(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。
注意:Y、Cb、Cr信号是分开储存的,所以DVD播放机要连三条线(DVD使用MPEG2格式)
YUV压缩
因为人类视网膜上的视网膜杆细胞要多于视网膜锥细胞,视网膜杆细胞的作用就是识别亮度,而视网膜锥细胞的作用就是识别色度。所以,眼睛对于亮和暗的分辨要比对颜色的分辨精细一些。
因此在视频存储中,没有必要存储全部颜色信号,存储了眼睛分辨不出来,因此没有必要浪费存储空间,于是有了YUV压缩。
常见的YUV压缩格式有4:4:4,4:2:2,色度信号分辨率最高的格式是4:4:4,也就是说,每4点Y采样,就有相对应的4点Cb和4点Cr。在这种格式中,色度信号的分辨率和亮度信号的分辨率是相同的。这种格式主要应用在视频处理设备内部,避免画面质量在处理过程中降低。RGB565
用16个bit表示1个像素,5个bit表示R(红色),6个bit表示G(绿色),5个bit表示B(蓝色),从高位到地位排列如下:
RRRRR GGGGGG BBBBB
根据RGB565的存储方式,即可获得R、G、B分量值。现假设存储某一点像素变量为color,数据类型是short,那么则有
R = color & 0xF800,获取高字节的5bit
G = color & 0x07E0,获取中间6个bit
B = color & 0x001F,获取低字节5个bit
RGB555
用16个bit表示1个像素,其中最高位不用,用X表示,5个bit表示R(红色),5个bit表示G(绿色),5个bit表示B(蓝色),从高位到地位排列如下:
X RRRRR GGGGG BBBBB
根据RGB555的存储方式,即可获得R、G、B分量值。现假设存储某一点像素变量为color,数据类型是short,那么则有
R = color & 0x7C00,获取高字节的5bit
G = color & 0x03E0,获取中间5个bit
B = color & 0x001F,获取低字节5个bit
RGB24
用24个bit表示1个像素,R(红色)、G(绿色)、B(蓝色)都用8个bit表示,从高位到地位排列如下:
RRRRRRRR GGGGGGGG BBBBBBBB
根据RGB24的存储方式,即可获得R、G、B分量值。现假设存储某一点像素变量为color,数据类型是short,那么则有
R = color & 0xFF0000,获取高字节的8bit
G = color & 0x00FF00,获取中间8个bit
B = color & 0x0000FF,获取低字节8个bit
RGB32(RGBA)
用32个bit表示1个像素,R(红色)、G(绿色)、B(蓝色)、A(透明度)都用8个bit表示,,从高位到地位排列如下:
RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAAA
根据RGB32的存储方式,即可获得R、G、B分量值。现假设存储某一点像素变量为color,数据类型是short,那么则有
R = color & 0xFF000000,获取高字节的8bit
G = color & 0x00FF0000,获取中间8个bit
B = color & 0x0000FF00,获取低字节8个bit
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)