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

求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分量的位运算逻辑如下:

  1. 红分量(Red565):取BinaryLow的高5位,右移3位后保留5位有效位
  2. 绿分量(Green565):将BinaryLow的低3位左移3位,再与BinaryHigh的高3位组合,得到完整6位绿分量
  3. 蓝分量(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:20:20