压缩二进制数据的快速方法?

时间:2010-11-02 02:40:24

标签: java android mobile

我在int [](或者你喜欢的字节[]中)有一些二进制数据(像素值),我想在Android应用中写入磁盘。我只想使用少量的处理时间,但我想要尽可能多的压缩。我有什么选择?

在许多情况下,数组将包含许多连续的零,因此像RLE压缩这样简单快速的东西可能会运行良好。虽然我看不到任何Android API函数。如果我必须在Java中循环数组,这将非常慢,因为在大多数Android设备上没有JIT。我可以使用NDK,但如果可以,我宁愿避免使用它。

5 个答案:

答案 0 :(得分:2)

Android拥有Java DeflaterOutputStream。那会有用吗?

答案 1 :(得分:2)

DeflatorOutputStream在Java中压缩1 MB需要大约25 ms。它是一种原生方法,所以JIT不应该有太大的区别。

您是否有要求说0.2s或0.5s太慢?

您可以在后台线程中执行此操作,以便用户不会注意需要多长时间吗?

GZIP基于Deflator + CRC32,因此可能会大致相同或稍慢。

Deflator有几种模式。 DEFAULT_STRATEGY在Java中速度最快,但更简单的压缩(例如HUFFMAN_ONLY)对您来说可能更快。

答案 2 :(得分:1)

将字节数组传递给
http://download.oracle.com/javase/6/docs/api/java/io/FileWriter.html
和链
http://download.oracle.com/javase/1.4.2/docs/api/java/util/zip/GZIPOutputStream.html 它呢

然后当你需要重新读取数据时 http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileReader.html
和链
http://download.oracle.com/javase/1.4.2/docs/api/java/util/zip/GZIPInputStream.html

根据您保存的文件大小,您会看到一些压缩Gzip很好,如果您没有看到很多交易,只需使用缓冲编写器写入未压缩的数据(这应该是最快的)。另外,如果你使用缓冲的写入器读取gzip,也可以加快它的速度。

答案 3 :(得分:1)

我必须在另一个平台上解决基本相同的问题,我的解决方案是使用修改后的LZW压缩。首先,在32bpp图像上进行一些差异过滤(类似于PNG)。如果存在大面积的共同颜色,这将使大部分图像变为黑色。然后使用通用GIF压缩算法将过滤后的图像视为8bpp。你会得到适当的压缩,它的工作速度非常快。这将需要在本机代码(NDK)中运行。在Android上使用本机代码非常容易。

答案 4 :(得分:0)

随机思考:如果是图像数据,请尝试将其保存为png。标准的java有它,我相信android也会,并且可能使用本机代码进行了优化。它具有非常好的压缩性,而且无损。