Java 40000字节的高性能数据压缩

Java 40000字节的高性能数据压缩,java,network-programming,compression,Java,Network Programming,Compression,我在互联网上看到过像zlib和lzo这样的数据压缩库。但我不确定压缩40000字节的最佳方式(它们是在字节[](x,y=color))中),我需要将其压缩到大约200字节,但有一个问题:这不会太长,最多可能是1/40秒 我不确定这是否有可能,最好的选择是什么。我还需要以字节[]的形式输出,这意味着我需要丢失数组的第二个维度,并且在解压发生时能够再次获得它。我不想将任何数据保存到文件中,因为我要将其发送到客户机,当我发送数据时,我只需给它一个字节[],其余的都由它完成。(我无法更改向客户端发送数据

我在互联网上看到过像zlib和lzo这样的数据压缩库。但我不确定压缩40000字节的最佳方式(它们是在
字节[](x,y=color)
)中),我需要将其压缩到大约200字节,但有一个问题:这不会太长,最多可能是1/40秒

我不确定这是否有可能,最好的选择是什么。我还需要以
字节[]
的形式输出,这意味着我需要丢失数组的第二个维度,并且在解压发生时能够再次获得它。我不想将任何数据保存到文件中,因为我要将其发送到客户机,当我发送数据时,我只需给它一个
字节[]
,其余的都由它完成。(我无法更改向客户端发送数据的方法。)谢谢您的帮助


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

从根本上说,没有通用的压缩方案能够以无损的方式对任意数据的每个输入实现显著的压缩。您可以接受获得比开始更多数据的可能性,也可以接受数据丢失。。。这是你的选择。不过,一般来说,试图将数据降到原始数据的1/20是一个相当高的要求

鉴于这是图像数据,您可能不应该查看通用压缩例程,而是查看图像格式,如JPEG、PNG等。除此之外,一些图像格式具有“质量”选项,允许您以较差的保真度为代价实现更高的压缩。尽管如此,200字节实际上并不是很多信息

在关注性能方面之前,我会先关注可行的结果(足够小,但质量足够好)。当你已经有了一些工作,你可以看到它是否足够快-但如果它不符合你最初的要求,那么努力工作使它快速是没有意义的


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

您不能总是将40000字节压缩到200字节而不丢失数据。但是,如果您的数据是计算机生成的图像,颜色很少,则生成200字节或更少字节的可能性不大:

1) 将数据馈送到PNG压缩库

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

2) 因为您知道图像的大小,所以删除头和所有其他可以在接收端恢复的块。剩下的就是
IDAT
块。即使这样,您也可以去掉它的前几位(块头)

解压缩时:

1) 在
IHDR
块(预先知道)和
PLTE
块(如果使用调色板)以及
IDAT
块的标题前加上前缀。追加
IEND
区块

2) 将此数据馈送到PNG解压缩库


.png
文件格式有很好的文档记录。您可以使用作为起点。

要检查您尝试的操作在理论上是否可行,请采集一个或多个输入图像样本,并计算该数据的(或)。这至少可以估计出数据中实际存在多少信息(熵)

如果一个输入图像中的熵计算超过200*8位,则可能没有通用的无损压缩方案可以对单个图像进行所需的压缩

但是,如果您有一系列图像,您可能只对一个图像与下一个图像之间的差异进行编码,并实现平均目标带宽;参见常见视频编解码器示例


也许还可以阅读一下。

40K->200??如果图像比吃豆人更复杂,你可能会遇到麻烦。有两件事需要澄清:a)你有多在乎失去一些准确性?和b)你对数据中的分布/模式了解多少?如果这一要求是某些投标/合同纾困的一部分,除非他们期望得到马丁提到的Pacman图像。我用更多信息编辑了这个问题,好像它不是正在读取的文件。你有一个2D颜色数组,但它不是图像?那是什么呢?你的第一句话是不准确的:存在许多有效的无损压缩方案,假设你能够利用你关于数据分布的知识(即,它不像纯粹的随机噪声)@米凯拉:我不知道有哪一种是无损的,在最坏的情况下也不会增大尺寸。@PeterLawrey:的确如此。但从信息论的角度来看……:)@彼得拉维:但在这种情况下,它又回到了“并非所有的输入都是有效的”-您基本上将输入集限制在40000*8个独立位以下。@user1691444:但您仍然可以将其视为图像,然后使用PNG压缩对其进行压缩。设置将在压缩时设置-不读取图像。同样,我的回答中没有任何内容要求您读取文件。我用更多信息编辑了这个问题,好像它不是正在读取的文件一样。@user1691444我从未声称它是文件。我只假设它是一个2D的颜色数组,应该是容易压缩的(例如图像),没有熵计算可以设置一个很好的限制