二进制数据的最佳压缩技术是什么?

9
我有一个大型二进制文件,表示图像中每个像素的alpha通道,0表示透明,1表示其他。需要从文本文件动态加载此二进制数据,并获得最大可能的压缩。解压时间不是非常重要的(除非从一分钟跳到一小时),但文件大小需要尽可能小。
目前我们尝试了运行长度编码,然后进行哈夫曼编码,然后将二进制数据转换为base64,以及运行长度编码,但使用数字值对零和字母等效对一进行区分(似乎给出了最佳结果)。不过,我们想知道是否存在比这两种方法更好的解决方案,因为我们从逻辑角度出发,而不是考虑所有可能的方法。

10
为什么不能简单地使用已经内置压缩功能的流行图像格式,例如PNG,而要发明自己的图像格式? - Asaph
1
Asaph +1。此外,“最佳”的压缩技术非常取决于您拥有的数据类型:想象一下通过调整照片和屏幕截图获得的1位图像。 - Anton Tykhyy
@Asaph 所说的没错。对于任何类型的图像(即照片使用 JPG,PNG),都有经过彻底优化和研究的图像压缩格式,其中包含数十年甚至几个世纪的工作。不要重复造轮子。 - Pekka
将解码数据的系统(World of Warcraft)不能使用传统图像 - 我们可以使用图像的内置文件格式,但是系统中没有内置用于处理图像的函数,并且我们需要在图像上进行碰撞检测,因此二进制网格是必要的。 - Jim
如果您无法使用传统格式,那么尝试将数据压缩成zip格式,看能够节省多少空间如何?我必须承认我从未为WoW开发过任何东西,因此对其限制不熟悉。通过一些搜索,我找到了一个可以让你制作WoW插件的VisualStudio项目(http://addonstudio.codeplex.com/),您可以向他们发送消息并询问是否知道任何改善游戏文件压缩的好方法。 - Liam
显示剩余2条评论
3个回答

15

由于外部库不可用,因此我为此创建了一种自定义解决方案。该系统使用运行长度编码来压缩数据,然后将RLE编码的数据表示为base32(32个字符用于零,匹配集用于一)。这使我们能够仅使用约30KB就能表示大约5MB的文件大小,而且没有任何损失。


11
提供一些代码吗? - user3011902
这里使用基32是有道理的。你会有很长的零模式,因此使用基32意味着你可以在每个数字中存储更多的信息。所以如果你有512个零,你可以将其表示为G00。3个字节而不是512个字节。但是你在这里是在处理最佳情况,所以要注意。 - Scuba Steve
@TastyLemons - 你不需要代码示例,他已经解释了构建此项目所需的一切。 - Scuba Steve

2

我同意,最好使用现有的经过验证的图像格式。如果你必须自己做,你可能最终会得到与某些现有技术非常接近的东西。

我认为我想存储以下字节重复的次数

|10|1|1|0|3|1|5|0

将产生

1111111111011100000

但是,如果从字节级别优化它,你很快就会发现这几乎正是RLE压缩所做的。长话短说,看看RLE ;)

祝你好运!


2

推荐使用7-Zip。它有非常好的压缩比,通常只有ZIP的十分之一大小,并且支持多种编程语言的语言绑定。

http://www.7-zip.org/sdk.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接