QR码压缩

5

不是你想要的答案,但是:如果你想把大量数据放在二维条码中,也许你应该看看数据矩阵。 - siukurnin
DataMatrix看起来不错。它不支持Unicode,但更加紧凑。我有一些随机的Android应用程序可以扫描代码,并且成功地扫描了DataMatrix。但是不确定它是否得到广泛支持,所以有些担心使用它。 - Sergey Ponomarev
4个回答

9
如果你的问题是:“在QR码中存储20K个字符是否可能?”,那么答案是“是”,这是“可能的”。
如果你的问题是:“是否可能保证你始终能够将20K个字符存储在QR码中以进行压缩?”,那么答案是“不可能”。由于pigeonhole原理,无法保证。
如果你的问题是:“是否存在一个“舒适区”,在这个区域内,文本输入最大大小为20K,并且很可能适合QR码?”,正确的答案是:这取决于你的输入数据。更冒险的答案是:如果你处理的是“正常文本”数据,例如书籍内容,你可能要求过高。
您提到的80-90%的压缩比是由于输入数据非常大(几MB),而解压算法非常慢。对于“小”的输入数据,例如20K个字符,对于“普通文本”,压缩比更可能在50-70%的范围内,这取决于算法强度(例如PPM非常适合此类输入数据)。
显然,如果您的输入数据是一种具有大量重复的“日志文件”,那么是可以轻松获得95%以上的压缩比的。
但是,压缩比并不是唯一要考虑的因素。对于“实际应用”,您还必须考虑QR码的大小以及QR打印的合理纠错水平。押注于“最大容量和最低纠错”是一个相当错误的押注,至少对于现实场景而言是如此。您将不得不向身边的人询问您的QR码的“合理限制”。很可能,打印能力会成为问题,并且您将不得不接受比最大容量小的某些东西。
最后一点,请不要忘记压缩数据是“二进制”,而不是“字母数字”。因此,您的QR码的最终容量在最后一列中。这比列“字母数字”少得多。

谢谢你的反馈。Cyan,我必须承认 - 你对“压缩”文本文件的二进制状态是完全正确的。我忘记了那个小细节。 ;) 我想要插入一个有两到三列“名称|值”,“名称|值|值”的表格。而且这两列都会有字符和数字。最多300-400条记录。 - Holy Sync
如果你想知道压缩比率,可以在你的数据表上使用可用的算法进行一些测试。例如,7zip 在“结构化”数据上具有相当不错的性能,这将提供第一个评估水平。 - Cyan

5
QR码有一种特殊的编码模式,适用于字母数字数据(仅限大写字母、数字和少量符号)。每个字符使用不到8位,最多可以在这种模式下存储4,296个字符。
这应该是接近最优的。对于更简单的数据(比如全是字母),像gzip这样的压缩算法可能能够实现每字节更少的位数。当然,没有标准的读取器会将gzipped负载解释为这样的内容。只有特殊的读取器才能做到。
你能用这种方式将5倍的数据存入QR码吗?几乎肯定不行,除非是像20,000个“a”这样的微不足道的情况。
即使你能,它也会创建一个大而复杂的QR码。任何持有超过几百字节的东西在实践中很难扫描。版本40,最大的版本,在现实世界中是无用的。甚至版本20也是如此。

Sean,感谢您的反馈 :) 我正在考虑构建自己的应用程序来读取和解压“zipQR”。 - Holy Sync

4

实际上,当您想使用QR码存储大量数据时,只需存储指向数据位置的URL。

理论上可能与在支持现实设备时可能完全不同。祝好运,您将无法使用低端智能手机相机扫描任何高于版本10(57x57模块)的内容。


URL/指针看起来比我之前想象的要有前途得多。谢谢你的回复@NiloVelez。 :) - Holy Sync

0

这取决于你的数据,正如其他人所指出的那样。如果是二进制的,我不知道。如果是纯文本,肯定可以。

诀窍是将其压缩,然后将其呈现为QR编码可以理解的形式(即:base64)。

演示如何对大约173kB的Lorem Impsum进行编码(假设您有一个QR程序来生成QR码,或者只需将base64编码的字符串复制粘贴到QR生成器中,例如this):

cat in.txt | gzip | base64 --wrap=0 | xclip | qr

生成此二维码: 输入图像描述

您可以通过解码二维码并将文本复制到回显命令中进行解码,从而获取它:

echo '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' | base64 -d | gunzip

似乎我的输入选择严重影响了测量结果。Lorem Ipsum的重复模式是一个不好的选择(变异性低)。我尝试使用普通文本进行测试,结果远远少于这个数量级,只有几KB。 - Mihai Galos

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