89 50 4E 47 0D 0A 1A 0AChunk Length (4 bytes) | Chunk Type (4 bytes) | Chunk Data (Length bytes) | Chunk CRC (4 bytes)
| 等級 | 操作 | 說明 |
|---|---|---|
| L1 | 移除非標準區塊 | 保留六大區塊,捨棄文字註解、時間等輔助區塊 |
| L2 | 移除固定檔頭/檔尾 | 解壓時自行補回 |
| L3 | 移除 Chunk Type | 自訂格式順序固定,解壓時按序補回 |
| L4 | 精簡 Chunk Length | IHDR 固定 13、PLTE 用 1 byte 記色數、tRNS 同色數、IDAT 需 4 bytes |
| L5 | 選擇性移除 CRC | 小區塊 CRC 計算快可忽略,大區塊視情況保留 |
| L6 | 壓縮區塊資料本身 | IHDR 保留寬高色深、PLTE 改 RGB565、tRNS 用 1 byte 索引、IDAT 可接入 zlib |
讀取自訂格式 → 依序寫入標準 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 等明顯特徵,易被定位。
自訂壓縮格式天然加密:
結果:標準 PNG 分析器完全失效,即使提取 IDAT 資料也只得灰階圖。達到知識產權保護目的。
深入理解 PNG 結構,可實作極致壓縮與強力加密雙重效果。歡迎同好共同探討更高階技術。