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

PNG 壓縮原理深度解析:從索引色到 USI 格式與解碼實現

     編輯:J2ME

一、圖像存儲基礎:索引圖 vs RGB 圖

1.1 索引圖

  • 色彩數固定(如 256 色以內)
  • 文件頭存儲調色板,每個像素僅存儲索引值(1 字節)
  • 文件體積較小

1.2 RGB 圖

  • 色彩數無限制
  • 每個像素完整存儲 RGB 值(3 字節)
  • 文件體積較大

結論:對於色彩較少的圖像,索引圖存儲效率遠高於 RGB 圖。

二、行程長度編碼(RLE)壓縮原理

針對索引圖按行掃描產生的索引序列 [I1][I2]...[In],利用連續相同像素特性:

  • 引入計數字節 [C1][I1][C2][I2]...[Cm][Im]
  • 單色圖極端情況下 256 像素僅需 2 字節
  • 適用於大面積純色、透明背景等場景

三、USI 格式進階壓縮:位級優化

針對調色板色數較少(如 32 色)的情況,索引值高位固定為 0,造成空間浪費。USI 將計數值壓入索引字節的高位:

  • 32 色:索引佔 5 位,高 3 位存計數 → 每字節最多表示 8 像素
  • 64 色:索引佔 6 位,高 2 位存計數 → 每字節最多表示 4 像素
  • 16 色:索引佔 4 位,高 4 位存計數 → 每字節最多表示 16 像素

最終格式:[G1][G2]...[Gk] + 調色板 + 元數據 = USI 文件

四、USI 解碼器核心代碼解析

4.1 文件加載與解析

private void load(String file) {
    DataInputStream din = new DataInputStream(getClass().getResourceAsStream(file));
    m_flags = din.readInt();           // 格式標記
    m_count = din.readByte() & 0xff;   // 調色板位數
    m_mask = 0xff >> (8 - m_count);    // 索引掩碼
    int pal_count = din.readByte() & 0xff; // 調色板組數
    int pal_len = din.readByte() & 0xff;   // 每組色數
    // 讀取調色板數據(12位色擴展為32位ARGB)
    // 讀取圖塊尺寸/模型信息
    // 讀取壓縮像素數據 m_data
    // 讀取每個圖塊數據偏移量 m_dataOffset
}

4.2 核心解壓算法

private int[] BuildRle8bFrm(int model_id, int pal_id) {
    int size = ...; // 圖塊寬×高
    int[] m_bufB = new int[size];
    int[] pal = m_pal[pal_id];
    int offset = m_dataOffset[model_id];
    int count, index, pos = 0;
    while (pos < size) {
        count = ((m_data[offset] & 0xFF) >> m_count) + 1; // 高位計數
        index = pal[m_data[offset] & m_mask];             // 低位索引查色
        offset++;
        while (--count >= 0) {
            m_bufB[pos++] = index;
        }
    }
    return m_bufB; // ARGB 像素數組
}

4.3 圖像生成

public Image GetImage(int model_id, int pal_id) {
    int[] argb = BuildRle8bFrm(model_id, pal_id);
    int w = ..., h = ...; // 從 flags 或 models 獲取尺寸
    Image img = Image.createRGBImage(argb, w, h, true);
    return img;
}

五、關鍵技術點總結

  • 位運算精髓:m_count、m_mask 分離計數與索引,極致壓縮存儲
  • 調色板複用:支援多組調色板,同一圖塊可套用不同配色
  • 靈活尺寸來源:支援統一尺寸或每幀獨立尺寸
  • J2ME 友好:無浮點運算、內存佔用可控、解碼速度快

USI 格式展示了在資源受限環境下,針對特定圖像特徵設計專用壓縮格式的經典思路,對嵌入式圖形開發極具參考價值。

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