1、RGB视频像素数据
RGB色彩模式,是通过对红绿蓝三个颜色通道的变化,以及相互之间的叠加得到各种颜色。
每种颜色值范围为0-255,所以每个颜色值使用1个字节byte也就是8个比特bit表示。
1.1、色深
色深即色彩深度,色彩深度是计算机图形学领域表示在位图或者视频帧缓冲区中储存1像素的颜色所用的位数,它也称为位/像素(bpp)。色彩深度越高,可用的颜色就越多。
1.2、RGB格式
1.2.1、索引形式
索引形式表示每个像素使用1、4、8个比特bit表示,存储的是对应像素在调色板的索引,而非像素的RGB分量值,调色板是通过编号映射到颜色的一张二维表。
| 索引形式 | 颜色 |
|---|---|
| RGB1 | 黑白两种颜色 |
| RGB4 | 16种颜色 |
| RGB8 | 256种颜色 |
1.2.2、像素形式
像素形式表示每个像素的RGB值使用N个比特bit表示。
| 像素形式 | 颜色 |
|---|---|
| RGB565 | R、G、B分别使用5、6、5个比特bit表示,共16个比特/位bit,2个字节byte,1个字Word |
| RGB55 | RGB分别使用5个比特表示,剩余一位高字节不用,共16个比特 |
| RGB24/RGB888 | RGB分别使用8个比特表示,共24个比特 |
| RGB32 | RGB分别使用8个比特表示,剩余8位低字节不用,共32个比特 |
假设计算机中存储某一个像素点的变量为color,数据类型为short。
RGB565:
1 | R = color & 0xF800, (获取高字节的 5 个 bit) |
RGB55:
1 | R = color & 0x7C00, (获取高字节的 5 个 bit) |
RGB24:
1 | R = color & 0x000000FF, |
RGB32:
1 | R = color & 0x0000FF00 |
1.2.3、RGB格式转换
RGB格式转换,由于精度不同,需要量化补偿和量化压缩。
1.2.3.1、量化补偿:
- 将原数据填充至高位
- 对于低位,用原始数据的低位进行补偿
- 如果仍然有未填充的位,继续使用原始数据的低位进行循环补偿
1 | 例子: 16 bit RGB565 -> 24 bit RGB888 的转换 |
1 | void rgb565_to_rgb888(unsigned char *image, unsigned char *image888) |
1.2.3.2、量化压缩:
三个字取高位
1 | 例子: 24 bit RGB888 -> 16 bit RGB565 的转换 |
1 | unsigned short rgb_24_to_565(unsigned short r, unsigned short g, unsigned short b) |