9

我正在尝试创建(或者,如果我在研究中以某种方式错过了它,请找到)一种将 bmp 图像编码/解码为 QR 码格式的算法。我一直在使用指南(Thonky)来尝试了解 QR 码的基础知识,但我仍然不确定如何解决这个问题,特别是:

  • 我应该将数据编码为二进制还是数字更合理(假设每个像素的最大值为 255)?

  • 我搜索了有关 QR 码的结构化附加功能的信息,但除了 QR 码支持这一事实之外,没有找到太多细节——我该如何实现/利用此功能?

而且,当然,如果有任何提示/建议可以更好地将图像存储为二进制数据,我非常愿意接受建议!

谢谢你的时间,

肖恩

4

3 回答 3

14

我不确定您能否实现这一目标,因为 QR 码可以保存的信息量非常有限。

首先,您可能希望将图像存储为原始字节,因为其他格式(数字和字母数字)旨在保存文本/数字,并提供更少的空间来存储您的图像。假设您选择最大可能的 QR 码(版本 40),具有最小的纠错级别,最多可容纳 2953 字节的二进制信息(见此处)

第一个选项,正如您所建议的,您将图像存储为位图。这种格式根本不允许压缩,并且需要(在没有 Alpha 通道的 RGB 图像的情况下)每个像素 3 个字节。如果我们考虑文件头大小(14 到 54 字节),并忽略填充(每行图像数据必须填充为 4 的倍数),那么您可以存储大约 2900/3 = 966像素。如果我们考虑一个正方形图像,这表示一个 31x31 的位图,即使是缩略图图像也很小(例如,本文末尾的我的头像是 32x32 像素)。

第二种选择,您使用 JPEG 对图像进行编码。这种格式的优点是使用可以减小文件大小的压缩算法。这次没有精确的公式来获得适合 2.9kB 的图像大小,但我尝试使用一些方形图像并缩小它们的大小,直到它们适合这个大小,保持良好的 (93) 质量因子:这给出了一个平均值大约 60x60 像素的图像。(在如此小的图像上,通常不会在 jpeg 和 bmp 之间看到令人难以置信的压缩系数,因为 jpeg 文件中的文件头远大于 bmp 文件:大约 500 字节)。这比位图好,但仍然很小。

最后,即使你成功地用这个二维码编码你的图像,你也会遇到另一个问题:这么大的二维码很难成功扫描。事实上,这个二维码的大小为 177x177 模块(“模块”是一个白色或黑色的小方块)。假设您使用提供所谓“高清”帧(1280x720 像素)的智能手机对其进行扫描,则每个模块在帧上的最大尺寸约为 4 像素。如果考虑到相机噪声、锯齿和由于用户在扫描时从未完全空闲而导致的模糊,输入帧的质量将使任何 QR 码解码算法都很难成功获取 QR代码(不要忘记我们在开始时将其纠错级别设置为低!)。

尽管这不是一个好消息,但我希望这对您有所帮助!

于 2012-10-17T08:38:57.993 回答
3

确实有一种方法可以对多个(最多 16 个)QR 码的信息进行编码,使用 QR 码中称为“结构化附加”的特殊标头。您可以使用的最佳信息来源是关于 QR 码的规范 (ISO 18004:2006);在网络上免费找到它是可能的(但不一定容易)。

该规范的相关部分(第 9 节)说:

“最多可以以结构化格式附加 16 个 QR 码符号。如果一个符号是结构化附加消息的一部分,它由前三个符号字符位置的标题块指示。结构化附加模式指示符 0011 放置在第一个符号字符中的四个最高有效位位置。紧随其后的是两个结构化附加码字,分布在第一个符号字符的四个最低有效位、第二个符号字符和第三个符号字符的四个最高有效位上. 第一个码字是符号序列指示符。第二个码字是奇偶校验数据,并且在消息中的所有符号中都是相同的,从而能够验证读取的所有符号构成同一结构化附加消息的一部分。该标头紧随其后的是从第一个模式指示符开始的符号的数据码字。”

不过,我不确定大多数 QR 码扫描仪是否可以处理这个问题,因为它是一项非常先进的功能。

于 2012-10-19T08:20:31.417 回答
1

您可以定义固定的图像大小,减少 jpg 标题部分并仅使用有关它的重要信息,因此您可以保存最多 480 字节的 ~500 字节的普通标题。

我是用这种方法来存储一张小俱乐部身份证的人物照片,大约64x64像素的图像就足够了。

于 2017-05-09T12:30:43.820 回答