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

J2ME 平台 PNG 圖像深度解析:格式結構、自定義壓縮、解壓與加密技術

     編輯:J2ME

PNG 格式基礎

PNG-24 vs PNG-8

  • PNG-24:24 位真彩色,支援 Alpha 通道,檔案大、部分機型建立/顯示失敗、速度慢。隨硬體升級未來將普及。
  • PNG-8:8 位索引色,調色盤最多 256 色(文中稱 128 色),目前主流格式。

PNG-8 檔案結構(六大區塊)

  1. 檔案頭:固定 8 bytes 89 50 4E 47 0D 0A 1A 0A
  2. IHDR:影像基本資訊(寬、高、色深、色彩類型、壓縮/濾波/掃描方法)
  3. PLTE:調色盤資料(RGB 三元組循環)
  4. tRNS:透明色資訊(可選,對應調色盤索引的透明標記)
  5. IDAT:影像資料(LZ77 壓縮,可多個區塊)
  6. IEND:檔案結尾,固定 12 bytes

通用區塊結構

Chunk Length (4 bytes) | Chunk Type (4 bytes) | Chunk Data (Length bytes) | Chunk CRC (4 bytes)

六級自定義壓縮策略

等級操作說明
L1移除非標準區塊保留六大區塊,捨棄文字註解、時間等輔助區塊
L2移除固定檔頭/檔尾解壓時自行補回
L3移除 Chunk Type自訂格式順序固定,解壓時按序補回
L4精簡 Chunk LengthIHDR 固定 13、PLTE 用 1 byte 記色數、tRNS 同色數、IDAT 需 4 bytes
L5選擇性移除 CRC小區塊 CRC 計算快可忽略,大區塊視情況保留
L6壓縮區塊資料本身IHDR 保留寬高色深、PLTE 改 RGB565、tRNS 用 1 byte 索引、IDAT 可接入 zlib

J2ME 端解壓還原

讀取自訂格式 → 依序寫入標準 PNG 結構至 ByteArrayOutputStream → Image.createImage(byte[], 0, len) 建立影像。

ByteArrayOutputStream out = new ByteArrayOutputStream();
// 1. 檔案頭
out.writeInt(0x89504E47);
out.writeInt(0x0D0A1A0A);
// 2. IHDR
out.writeInt(13); out.writeInt(0x49484452); // "IHDR"
out.writeInt(width); out.writeInt(height);
out.writeByte(depth); out.writeInt(0x03000000); // 固定值
out.writeInt(crc32); // 計算 CRC
// 3. PLTE, tRNS, IDAT... 同理
// 4. IEND
out.writeInt(0); out.writeInt(0x49454E44); out.writeInt(0xAE426082);

byte[] png = out.toByteArray();
Image img = Image.createImage(png, 0, png.length);

注意:中途資料寫入錯誤會導致建立失敗且難除錯,建議自訂格式定型後一次寫對。

加密防盜圖技術

傳統加密:打亂區塊順序,但保留 IHDR/IEND 等明顯特徵,易被定位。
自訂壓縮格式天然加密:

  • Chunk Type、Length、CRC 全移除
  • 區塊資料重新編碼(如 PLTE 改 RGB565、tRNS 改索引)
  • 寫入順序可打亂(寬高色深順序可調換)

結果:標準 PNG 分析器完全失效,即使提取 IDAT 資料也只得灰階圖。達到知識產權保護目的。

結語

深入理解 PNG 結構,可實作極致壓縮與強力加密雙重效果。歡迎同好共同探討更高階技術。

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