RGB 颜色格式转换

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 位(即一个字节)二进制数值表示。

rgb888

RGB565: 同样 RGB 即组成任意颜色的三基色,红色Red,绿色Green,蓝色Blue 首字母的缩写。RGB565 即红色分量 R 使用 5 位(即一个字节中的高 5 位)二进制数值表示,绿色分量 G 使用 6 位(即一个字节中的高 6 位)二进制数值表示,蓝色分量 B 使用 5 位(即一个字节中的高 5 位)二进制数值表示。

rgb565.png

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值