我正在尝试创建(或者,如果我在某些方面错过了我的研究,找到)一种算法,用于将bmp图像编码/解码为QR码格式。我一直在使用指南(Thonky)来尝试理解QR码的基础知识,我仍然不确定如何解决这个问题,具体来说:
我应该将数据编码为二进制还是数字更合理(假设每个像素的最大值为255)?
我已经搜索了有关QR码结构化附加功能的信息,但除了QR码支持之外还没有找到太多细节 - 我该如何实现/利用这个功能?
当然,如果有任何提示/建议可以更好地将图像存储为二进制数据,我会非常乐于接受建议!
感谢您的时间,
肖恩
答案 0 :(得分:11)
我不确定你是否能够实现这一目标,因为QR码可以容纳的信息量非常有限。
首先,您可能希望将图像存储为原始字节,因为其他格式(数字和字母数字)旨在保存文本/数字,并且可以提供更少的空间来存储图像。假设您选择最大可能的QR码(版本40),具有最小级别的纠错,最多可容纳2953个字节的二进制信息(see here)。
第一个选项,如您所示,将图像存储为位图。这种格式根本不允许压缩,并且需要(在没有alpha通道的RGB图像的情况下)每个像素3个字节。如果我们考虑文件头大小(14到54个字节),并忽略填充(每行图像数据必须填充到4的倍数),这允许您存储大约2900/3 = 966像素。如果我们考虑一个方形图像,这表示一个31x31位图,即使对于缩略图图像也很小(例如,我在这篇文章末尾的头像是32x32像素)。
第二个选项,您使用JPEG对图像进行编码。此格式的优点是使用可以减小文件大小的压缩算法。这次没有确切的公式来使图像的大小适合2.9kB,但我尝试使用几个方形图像并缩小尺寸直到它们适合这个尺寸,保持良好的(93)品质因数:这给出了平均值大约60x60像素的图像。 (在如此小的图像上,通常不会在jpeg和bmp之间看到令人难以置信的压缩因子,因为jpeg文件中的文件头远大于bmp文件中的文件头:大约500字节)。这比位图好,但仍然很小。
最后,即使您成功在此QR码中对图像进行编码,您也会遇到另一个问题:这么大的QR码非常非常难以成功扫描。事实上,这个QR码将具有177x177模块的大小(“模块”是小的白色或黑色方块)。假设您使用提供所谓“HD”帧(1280x720像素)的智能手机进行扫描,每个模块在帧上的最大尺寸约为4像素。如果考虑到相机噪声,由于用户在扫描时永远不会完全空闲而导致的混叠和模糊,输入帧的质量将使任何QR码解码算法成功获取QR非常困难代码(不要忘记我们在此开始时将其错误修正级别设置为低!)。
尽管这不是一个好消息,但我希望这可以帮到你!
答案 1 :(得分:2)
确实有一种方法可以使用QR码中的特殊标题“结构化附加”在几个(最多16个)QR码上编码信息。您可以使用的最佳信息来源是关于QR码的标准(ISO 18004:2006);在网上免费找到它是可能的(但不一定容易)。
该规范的相关部分(第9节)说:
“最多16个QR码符号可以以结构化格式附加。如果符号是结构化附加消息的一部分,则由前三个符号字符位置中的标题块指示。 结构化附加模式指示符0011被放置在第一符号字符中的四个最高有效位位置。 紧接着是两个结构化附加码字,分布在第一个符号字符的四个最低有效位,第二个符号字符和第三个符号字符的四个最高有效位上。第一个码字是符号序列指示符。第二个码字是奇偶校验数据,并且在消息中的所有符号中是相同的,使得能够验证所读取的所有符号是同一结构化附加消息的一部分。此标头后面紧跟着符号的数据代码字,从第一个模式指示器开始。“
尽管如此,我不确定大多数QR码扫描仪都可以处理这个问题,因为它是一个非常先进的功能。
答案 2 :(得分:1)
您可以定义固定的图像大小,减少jpg标题部分并仅使用有关它的重要信息,这样您就可以保存最多480字节的~500字节普通标题。
我使用这种方法为小型俱乐部身份证存储人物照片,大约64x64像素的图像就足够了。