RGB565 与 RGB888的相互转换 (颜色补偿)
RGB565 和 RGB888是两种不同的颜色表示方式,在计算机图形学和显示领域中被广泛使用。RGB565使用16位数据表示一种颜色,每个颜色通道(红色、绿色、蓝色)使用5位、6位和5位的数字分别表示,而RGB888则使用24位数据表示一种颜色,每个颜色通道都使用8位数字。相互转换时,需要对颜色值进行折算和补偿,以确保转换后的颜色与原始颜色尽可能接近。
RGB888 -> RGB565
1.取RGB888中第一个字节的高5位作为转换后的RGB565的第二个字节的高5位
2.取RGB888中第二个字节的高3位作为转换后的RGB565第二个字节的低3位
3.取RGB888中第二个字节的第4--6位,作为转换后的RGB565第一个字节的高3位
4.取RGB888中第二个字节的第三个字节的高5位作为转换后的RGB565第一个字节的低5位
RGB565 -> RGB888
RGB565的存储方式为:
R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0
1.取RGB565第一个字节中低5位作为RGB888的高5位
2.取RGB565第二个字节中的低3位,将其左移5位,作为RGB888第二个字节的高5位
3.取RGB565第一个字节的高3位将其右移3位,作为RGB888第二个字节的4--6位
4.取RGB565第二个字节中的高5位作为RGB888第三个字节。
量化压缩与量化补偿
细心地哥们一定会发现如果我们是低位往高位上转的话,就存在一些数据精度的丢失问题,在网上查了写资料,借鉴了一下别人的方法;所谓的量化补偿,讲一下量化压缩与量化补偿。
在进行色彩格式转换的时候,经常会遇到色彩量化位数的改变,比如说从 24bit RGB888 到 16bit RGB565 的色彩转换。所谓量化压缩与量化补偿都是我个人所提出的概念,现说明如下:
量化压缩 ,举例:
1 | 24bit RGB888 -> 16bit RGB565 的转换 |
量化位数从8bit到5bit或6bit,取原8bit的高位,量化上做了压缩,却损失了精度。
量化补偿 ,举例:
1 | 16bit RGB565 -> 24bit RGB888 的转换 |
说明:第二行的 24bit RGB888 数据为转换后,未进行补偿的数据,在精度上会有损失
第三行的 24bit RGB888 数据为经过量化补偿的数据,对低位做了量化补偿
可以很容易的证明,这样的补偿方法是一种合理的线性补偿。补偿的原理很简单,大家仔细想一下就明白了,因此不再详细说明。
总结一下
量化压缩的方法:三个字取高位
量化补偿的方法:
1. 将原数据填充至高位
2. 对于低位,用原始数据的低位进行补偿
3. 如果仍然有未填充的位,继续使用原始数据的低位进行循环补偿
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小石头的博客!