1. 图像格式简介
计算机中图像基本是以 RGB888 格式显示的,特别是在我们常用的电脑计中,24 位图每个像素保存了 32bit 的数据,即 RGB888+Alpha,Alpha 即半透明填充字节。对于真彩的图像而言,肉眼在16bit 的时候已经难以分辨了,很多时候时候我们可以将 RGB888 转换为 RGB565 来存储,减少了存储器的容量的同时,降低了数据量。在显示的时候,我们再把 RGB565 转换为 RGB888,实现数据宽度的匹配。RGB888 总共使用24 位(三个字节)二进制数值表示,但是需要占用 四个字节存储空间,RGB565 总共使用 16 位(二个字节)二进制数值表示,刚好占用二个字节存储空间。
2. RGB888 与 RGB565
RGB888:
RGB
即组成任意颜色的三基色,红色Red,绿色Green,蓝色Blue 首字母的缩写。RGB888
即红色分量 R 使用 8 位(即一个字节)二进制数值表示,绿色分量 G 使用 8 位(即一个字节)二进制数值表示,蓝色分量 B 使用 8 位(即一个字节)二进制数值表示。
RGB565: 同样
RGB
即组成任意颜色的三基色,红色Red,绿色Green,蓝色Blue 首字母的缩写。RGB565
即红色分量 R 使用 5 位(即一个字节中的高 5 位)二进制数值表示,绿色分量 G 使用 6 位(即一个字节中的高 6 位)二进制数值表示,蓝色分量 B 使用 5 位(即一个字节中的高 5 位)二进制数值表示。
3. rgb565 转换到 rgb888
通过上方的内容可以知道,rgb565 转换到 rgb888 只要填充 RGB565 中,每个颜色分量相对于 8 位二进制数值缺失的低位即可。
// RGB565 convert to RGB888
BMP_WRITE_DATA((color & 0x1f) << 3);
BMP_WRITE_DATA(((color >> 5) & 0x3f) << 2);
BMP_WRITE_DATA((color >> 11) << 3);
4. rgb888 转换到 rgb565
通过上方的内容可以知道,rgb888 转换到 rgb565 的方法是只要提取每个颜色分量相对于 8 位二进制数值中相对应的高位即可(R 高 5 位,G 高 6 位,B 高 5 位),但这会导致低位的缺失影响精度,而且是无法恢复的。
unsigned short rgb888_to_rgb565(unsigned int rgb888)
{
unsigned char r, g, b;
unsigned short rgb565 = 0;
r = rgb888 >> 16;
g = rgb888 >> 8;
b = rgb888 >> 0;
r >>= 3; // 分量5
g >>= 2; // 分量6
b >>= 3; // 分量5
rgb565 = r << 11 | g << 5 | b << 0;
return rgb565;
}