求RGB565格式U16 HEX转RGB888的逆向转换代码实现
逆向实现RGB565转RGB888的C#函数
已知正向RGB888转RGB565的C#代码,需补全逆向函数:从代表RGB565格式U16值的BinaryLow和BinaryHigh字节中还原红、绿、蓝分量,再转换为RGB888格式的Color对象。
正向转换代码
private byte[] ConvertRGB888COLORtoU16HEXasRGB565COLOR(Color color) { byte[] ReturnByte = new byte[2]; Int32 red; Int32 green; Int32 blue; red = (Int32)Math.Floor(color.R * 31.0 / 255.0); green = (Int32)Math.Floor(color.G * 63.0 / 255.0); blue = (Int32)Math.Floor(color.B * 31.0 / 255.0); byte byte0 = (byte)(((red & 0xFF) << 3) | ((green & 0xFF) >> 3)); byte byte1 = (byte)(((green & 0xFF) << 5) | (blue & 0xFF)); ReturnByte[0] = byte0; ReturnByte[1] = byte1; return ReturnByte; }
逆向函数补全说明
先拆解正向的位分配逻辑:
BinaryLow(byte0):高5位对应RGB565的红分量,低3位对应RGB565绿分量的高3位BinaryHigh(byte1):高3位对应RGB565绿分量的低3位,低5位对应RGB565的蓝分量
基于此,逆向提取RGB565分量的位运算逻辑如下:
- 红分量(Red565):取
BinaryLow的高5位,右移3位后保留5位有效位 - 绿分量(Green565):将
BinaryLow的低3位左移3位,再与BinaryHigh的高3位组合,得到完整6位绿分量 - 蓝分量(Blue565):取
BinaryHigh的低5位
同时修正原框架中计算RGB888分量的错误(如变量名写错、复用红分量计算蓝分量的问题),改用整数运算避免浮点误差。
完整逆向函数
private Color ConvertU16HEXasRGB565COLORtoRGB888COLOR(byte BinaryLow, byte BinaryHigh) { // 从BinaryLow和BinaryHigh提取RGB565分量 int Red565 = (BinaryLow >> 3) & 0x1F; // 0x1F是5位全1的掩码,保留高5位 int Green565 = ((BinaryLow & 0x07) << 3) | ((BinaryHigh >> 5) & 0x07); // 组合绿分量的高低3位 int Blue565 = BinaryHigh & 0x1F; // 0x1F保留低5位 // 转换为RGB888分量,用整数运算实现四舍五入 int Red888 = (Red565 * 255 + 15) / 31; int Green888 = (Green565 * 255 + 31) / 63; int Blue888 = (Blue565 * 255 + 15) / 31; // 确保分量值在0-255范围内,避免边界计算溢出 Red888 = Math.Clamp(Red888, 0, 255); Green888 = Math.Clamp(Green888, 0, 255); Blue888 = Math.Clamp(Blue888, 0, 255); Color ReturnColor = Color.FromArgb(Red888, Green888, Blue888); return ReturnColor; }
关键细节说明
- 掩码
0x1F(二进制11111)用于保留5位有效位,0x07(二进制111)用于保留3位有效位 - 整数运算中的
+15和+31是为了实现四舍五入:比如Red565*255/31,加上31/2=15后再整除,等价于浮点运算的四舍五入效果 Math.Clamp用于确保分量值不会超出RGB888的0-255范围,避免因计算导致的异常值
内容的提问来源于stack exchange,提问作者Ally
相关产品推荐
相关产品推荐

