You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RGB888转RGB565三种转换算法的正确性与性能咨询

RGB888转RGB565三种转换算法对比

我整理了三种RGB888转RGB565的算法,目前无法确定哪一种准确性最优:

  • 前两种算法输出结果完全一致,核心都是截断高位实现转换,没有整数乘除法运算,执行速度更快;
  • 第三种算法结果和前两种不同,但与在线计算器的输出相符,它通过线性缩放实现分量映射,逻辑更合理,但因为包含乘除法,执行效率稍低。

代码实现

uint8_t r8, g8, b8;
uint16_t r5, g6, b5, val;

r8 = someredvalue;
g8 = somegreenvalue;
b8 = somebluevalue;


// first method:
b5 =  (b8  >> 3)        & 0x001F;
g6 = ((g8  >> 2) <<  5) & 0x07E0;
r5 = ((r8  >> 3) << 11) & 0xF800;
val = (r5 | g6 | b5);
printf("%d, %d, %d, %u\n", r8, g8, b8, val);


// second method:
val = ((r8 & 0b11111000) << 8) | ((g8 & 0b11111100) << 3) | (b8 >> 3);
printf("%d, %d, %d, %u\n", r8, g8, b8, val);


// third method:
r5 = r8 * 31 / 255;
g6 = g8 * 63 / 255;
b5 = b8 * 31 / 255;     
val =  (r5 << 11) | (g6 << 5) | (b5);
printf("%d, %d, %d, %u\n", r8, g8, b8, val);

算法细节解析

  • 前两种算法:本质是截断8位分量的低位,直接保留高位有效位。比如红色分量取8位的前5位,绿色取前6位,蓝色取前5位,通过移位和掩码操作组合成16位的RGB565值。这种方式完全依赖位运算,没有计算开销,速度最快,但会直接丢弃低位的颜色信息,属于“近似截断”转换。
  • 第三种算法:通过线性缩放实现分量映射,将8位的0-255范围等比例缩转到对应位数的范围(红色/蓝色0-31,绿色0-63)。这种转换更符合颜色分量的比例关系,结果和标准在线计算器一致,准确性更优,但整数乘除法会带来一定的执行开销,速度不如前两种。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:04:49