首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

RGB565 與 RGB888 色彩格式互轉演算法詳解與程式碼實作

     編輯:關於C++

格式定義對照

格式每像素位元RGB記憶體排列
RGB56516-bit (2 bytes)5-bit6-bit5-bitByte0: RRRRRGGG, Byte1: GGGBBBBB
RGB88824-bit (3 bytes)8-bit8-bit8-bitByte0: R, Byte1: G, Byte2: B

位元分佈圖解 (RGB565)

Bit: 15 14 13 12 11 10  9  8 |  7  6  5  4  3  2  1  0
     R4  R3  R2  R1  R0  G5  G4  G3 | G2  G1  G0  B4  B3  B2  B1  B0
Byte1 (高位址)                     Byte0 (低位址)

RGB565 → RGB888 轉換邏輯

  1. R:取 Byte1 高 5 位 → 左移 3 位補齊 8 位
  2. G:取 Byte1 低 3 位 (G5-G3) 左移 5 位 + Byte0 高 3 位 (G2-G0) 右移 3 位 → 合併 6 位 → 左移 2 位補齊 8 位
  3. B:取 Byte0 低 5 位 → 左移 3 位補齊 8 位

程式碼實作

方法一:逐像素位元運算

void RGB565_to_RGB24(unsigned char *source, unsigned char *convert, int width) {
    for (int i = 0; i < width; i++) {
        *convert++ = (*source) << 3;                                    // B
        *convert++ = ((*(source+1) & 0x07) << 5) | ((*source & 0xE0) >> 3); // G
        *convert++ = *(source+1);                                       // R
        source += 2;
    }
}

方法二:以 unsigned short 直接存取

void RGB16toRGB24(unsigned char *rgb24, unsigned char *rgb16, int width, int height) {
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            unsigned short *dot = (unsigned short *)(rgb16 + (i * width + j) * 2);
            *rgb24++ = ((*dot) & 0x1F) << 3;        // R (5-bit → 8-bit)
            *rgb24++ = ((*dot) & 0x7E0) >> 3;       // G (6-bit → 8-bit)
            *rgb24++ = ((*dot) & 0xF800) >> 8;      // B (5-bit → 8-bit)
        }
    }
}

注意:方法二假設記憶體為 Little Endian,且 RGB565 排列為 R-G-B 依序對應高到低位元,需依實際平台驗證位元遮罩。

量化補償觀念(擴展閱讀)

低位元擴展時,單純左移會造成精度遺失(如 5-bit 0x1F 左移 3 成 0xF8,非 0xFF)。量化補償策略:將原低位元複製填補低位,例如 5-bit 擴展 8-bit:(val << 3) | (val >> 2),使最大值 0x1F → 0xFF,視覺更均勻。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved