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

RGB 色彩量化壓縮與補償技術:RGB888、RGB565、RGB32 互轉精度控制

     編輯:關於C++

RGB 色彩模型基礎

RGB 為加色混合模型,工業標準色彩空間。各分量 0-255 對應亮度。長整數表示公式:65536 * Blue + 256 * Green + Red。

常見格式位元分配

  • RGB888 (24-bit):R8 G8 B8
  • RGB565 (16-bit):R5 G6 B5
  • RGB555 (16-bit):R5 G5 B5 (保留 1-bit)
  • RGB32 (32-bit):通常為 ARGB8888 或 XRGB8888 (A8 R8 G8 B8)

量化壓縮:高位元截斷 (24-bit → 16-bit)

RGB888: R7 R6 R5 R4 R3 R2 R1 R0  G7 G6 G5 G4 G3 G2 G1 G0  B7 B6 B5 B4 B3 B2 B1 B0
RGB565: R7 R6 R5 R4 R3            G7 G6 G5 G4 G3 G2        B7 B6 B5 B4 B3

直接取各分量高 5/6/5 位,低位元捨棄 → 精度損失。

量化補償:低位元擴展 (16-bit → 24-bit)

無補償 (單純左移)

RGB565: R4 R3 R2 R1 R0  G5 G4 G3 G2 G1 G0  B4 B3 B2 B1 B0
RGB888: R4 R3 R2 R1 R0 0  0  0  G5 G4 G3 G2 G1 G0 0  0  B4 B3 B2 B1 B0 0  0  0

低位元全 0,顏色階調不連續。

線性量化補償 (推薦)

RGB888: R4 R3 R2 R1 R0 R2 R1 R0  G5 G4 G3 G2 G1 G0 G1 G0  B4 B3 B2 B1 B0 B2 B1 B0

原則:

  1. 原資料填入高位元
  2. 低位元用原資料低位元循環填補
  3. 若仍有剩餘位元,繼續循環填補

此為線性內插近似,可證明誤差均勻分佈,視覺品質最佳。

轉換演算法總結

RGB888 → RGB565 (量化壓縮)

  1. R:取 Byte0 高 5 位 → 置入 Byte1 高 5 位
  2. G:取 Byte1 高 3 位 → 置入 Byte1 低 3 位;取 Byte1 第 4-6 位 → 置入 Byte0 高 3 位
  3. B:取 Byte2 高 5 位 → 置入 Byte0 低 5 位

RGB565 → RGB888 (量化補償)

  1. R:Byte0 低 5 位 → Byte0 高 5 位,低 3 位用原低 3 位循環補 (R2 R1 R0)
  2. G:Byte1 低 3 位左移 5 位 + Byte0 高 3 位右移 3 位合併 6 位 → Byte1,低 2 位用原低 2 位循環補 (G1 G0)
  3. B:Byte1 高 5 位 → Byte2 高 5 位,低 3 位用原低 3 位循環補 (B2 B1 B0)

實作建議

  • 使用查表法 (256-entry LUT) 加速 5/6-bit ↔ 8-bit 轉換
  • SIMD 指令集 (NEON/SSE) 可並行處理多像素
  • 注意記憶體對齊與 Endianness
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved