性能数据压缩为40,000字节

时间:2012-12-30 10:31:28

标签: java network-programming compression

我见过互联网上的数据压缩库,如 zlib lzo 。但是我不确定压缩40,000个字节的最佳方法(它们在byte[][](x,y = color)中),我需要将它降低到200字节,但有一个问题:这可能不会花太长时间,也许最多1/40秒。

我不确定这是否可能,以及最佳选择。我还需要输出为byte[]意味着我需要丢失数组的第二维,并且能够在解压缩时再次获得它。我不想将任何数据保存到文件中,因为我要将其发送到客户端,当我发送数据时,我只需要给它一个byte[]并完成所有其他操作。 (我无法更改向客户端发送数据的方法。)感谢您的帮助。

编辑:我不介意我丢失数据,只要该数据每次发送时都会发送相同的数据,因为每1/4秒会有更新的新信息发送,我不发送一个图像所以你所说的png dossent真的很有帮助,因为我正在编写服务器程序的颜色(不是从文件中读取)。希望这有帮助。

3 个答案:

答案 0 :(得分:2)

从根本上说,没有通用的压缩方案可以无损地为任意数据的每个输入实现显着的压缩。你可以忍受获得比你开始时更多数据的可能性,或者数据丢失......这是你的选择。尽管如此,试图将数据降低到原始数据的1/20是一个非常高的顺序。

鉴于这是图像数据,您可能不应该关注通用压缩例程 - 而是查看JPEG,PNG等图像格式。除此之外,某些图像格式具有“质量”选项,允许您以较差的保真度为代价实现更大的压缩。仍然,200字节确实没有太多信息......

在专注于性能方面之前,我会专注于获得可行的结果(足够小,但质量足够好)。当你有一些工作的时候,你可以看到它是否足够快 - 但如果它不符合你的初始要求就没有必要努力去做一些快速的东西。

如果使用基于图像的压缩,1D / 2D方面可能会丢失。如果你采用某种自定义方案,那么存储一个维度的长度并推断另一个维度就足够了。这基本上是您需求中问题最少的部分:)

答案 1 :(得分:1)

在不丢失数据的情况下,无法始终将40000字节压缩为200字节。但是,如果您的数据是计算机生成的图像,颜色很少,则不太可能产生200字节或更少:

1)将数据输入PNG压缩库。

最好的压缩需要一些时间,但您可以通过略微牺牲压缩级别来节省大量时间。如果您的库是OptiPNG,那么2或3的级别可能是速度和压缩之间的良好平衡。

2)由于您知道图像大小,因此删除标题以及您可以在接收方恢复的所有其他块。你应该留下的只是IDAT块。即使这样,你也可以剥掉它的前几位(块头)。

解压缩时:

1)预先添加IHDR块(事先已知)和(如果使用调色板)PLTE块(也已提前知道)和IDAT的标头块。附加IEND块。

2)将此数据提供给PNG解压缩库。

.png文件格式已有详细记录。您可以使用wikipedia作为起点。

答案 2 :(得分:0)

要检查您尝试做的事情理论上是否可行,请拍摄一个或多个输入图像样本并计算entropy(或"Shannon Entropy")数据。这将至少估计出数据中实际存在多少信息(熵)。

如果一个输入图像中的熵计算到超过200 * 8位,则可能存在 no 一般无损压缩方案,可以在单个图像上执行所需的压缩

但是,如果您有一系列图像,则可能只编码从一个图像到下一个图像的差异,并实现平均目标带宽;例如,参见常见的视频编解码器。

也许还会对"Source coding"进行阅读。