在过去的几天里,我对 PNG 做了一些摆弄,我对我的发现感到不安。我的结论是,我的大部分结果都与压缩有关。所以这个周末我将深入研究高级压缩文章。到目前为止,我想分享我的发现。看看是否有人对实现我的目标有任何建议,并可能为我指明正确的方向。
我目前正在做一个项目,我需要在不到 15 秒的窗口内获得尽可能小的文件大小。
我正在使用的大多数图像都是具有完整 256 调色板的 PNG-8bpp。我可以用 5bpp(32 色)准确地表示这些图像中的大多数。
但是,PNG 索引仅支持 1、2、4 和 8bpp。所以我的想法是将 PNG 格式剥离为我需要的最少信息,并编写一个编码器/解码器来支持 3、5、6 或 7bpp 的 IDAT 部分。
Test 1:
Original File: 61.5KB, 750 * 500, 8pp Palette, 256 colors, No tRNS
After Optimizations (Reductions to 4bpp, Strip Anx Chunks, & PNGOUT): 49.2KB 4bpp, 16 Colors
Human Interpretation: I can see 6 distinguishable colors.
由于我只需要六种颜色来表示图像,因此我决定使用 3bpp 对 IDAT 进行编码,以提供最多 8 种颜色的调色板。首先,我解压缩了 IDAT,得到了 368KB 的新文件大小。在对 IDAT 应用 3bpp 后,我新的未压缩文件大小为 274KB。我的开始似乎是一个好的开始……接下来我将 deflate 应用到我的新 IDAT 部分。结果... 59KB。
比使用 4bpp 大 10KB。
Test 2:
Original File: 102KB, 1000 * 750, 8bpp, 256 Colors, tRNS 1 fully transparent color
After Optimization: 79KB, 8bpp, 193 colors, tRNS 1 full transparent color
Human Interpretation: I need about 24 colors to represent this picture.
24 种颜色可以在 5bpp 中以 32 种颜色表示。使用上述相同的技术,我能够获得比未压缩更好的结果,但我再次在压缩时失败了。最终大小压缩... 84KB。然后我尝试了 6,7bpp... 与 8bpp 相同的结果压缩更差。
只是为了确保我保存了所有未压缩的图像并尝试了其他几种压缩算法...... LZMA、BZIP2、PAQ8......同样的结果是 8bpp 的压缩大小比 5,6 或 7bpp 更小,4bpp 的压缩大小比 3bpp 更小.
为什么会出现这种情况?我可以调整/修改压缩算法以针对使用 5,6 或 7bpp 格式的类似 PNG 的格式来进行 8bpp 压缩吗?值得花时间吗……是的,再节省 10KB 是值得的。