是否有任何好的无损图像编码/解码库,其压缩率与PNG差不多相似,但解码到原始RGB位图数据会比PNG快得多?
还需要Alpha透明度,但不是必需的,因为alpha通道可以从单独的图像中获取。
原始问题在于使用标准库在iPhone上读取和解码PNG文件的速度很慢。很明显,简单的解决方案就是存储原始的RGB位图数据,但是解压缩的ipa的大小太大 - 比PNG文件大4倍。所以,我试图找到一些妥协的解决方案。
答案 0 :(得分:1)
为什么不使用原始的原始RGB(A)数据并使用zip,RLE,Huffman等进行压缩和解压缩?
答案 1 :(得分:1)
只要您不需要在iPhone上压缩,Lempel-Ziv解码就会非常快。然而,你是否会获得良好的压缩是另一个问题。您的第一步应该是以原始ppm
格式转储图片并使用gzip
对其进行压缩。我在几个SO屏幕截图上尝试了这个,并且因为颜色数量相对较小,所得到的文件大小与PNG大小相同(略小)。测试是
pngtopnm so.png | gzip -v9 | wc -c
如果这个测试为你的应用程序产生了足够小的东西,你就可以了 - 只需在原始位图上运行gzip并在你的iPhone应用程序中使用微小的,事实上的libz解码器。如果是不够快,你可以尝试更快的基于Lempel-Ziv的解码器。
如果您的图片有很多颜色并且效果不佳,您可能需要考虑某种形式的有损压缩。
答案 2 :(得分:0)
除非您的图像受限于特定问题域(例如计算机生成的屏幕截图),其中定制解决方案可能能够同时满足压缩比和解码目标的速度,否则这些通常需要权衡,您必须在或者另一个。
PNG压缩正在使用熵编码技术,因此重新实现这一技术不太可能有所帮助。
你可以采用某种程序化解决方案,通过在单独的线程中延迟加载图像来“隐藏”用户的缓慢。
答案 3 :(得分:0)
PNG压缩是一种基本预测(邻居像素),然后是Zip压缩。如果你确实需要具有低内存CPU要求的无损压缩,那么这个策略很难被击败......因为你有一个像样的PNG创建库。编码瓶颈是zip压缩。 (并且,正如另一个人所指出的那样,请记住解码比编码快得多)。 只是拉动原始图像只会略微加快,并且(非常特殊的图像除外)获得低得多的压缩效率。
答案 4 :(得分:0)
使用7zip SDK解码格式为ABGR(little endian)的原始图像数据,可以获得最快速,最脏的结果。然后,您可以使用UIKit API将此图像数据blit到屏幕。如果你想看一下iOS代码示例,可以在“AVAnimator iOS”上进行谷歌搜索,你会发现一个实现这种方法的开源库。您需要做的主要是确保图形数据的每个像素已经以iOS的最佳方式格式化,这基本上是xcode在准备用于iOS项目的PNG文件时所做的事情。