如何离线存储二维码内容中的图像

how to store an image inside a qr code content offline

我想离线存储一张图片到二维码中。当用户扫描二维码时,图像将自动显示,无需任何网络连接。有办法吗?

不可能

二维码reader用于解密文本条目。您唯一的方法是在您的二维码中放置一个 link 重定向到图像:并且 需要连接 .

即使您将图像编码为数据 URI,QR 码也会太大而无法正确读取。 QR码被制作成封装大约250个字符。数据 URI 图片的长度约为 10,000 到 1,000,000 个字符。

即使它被正确读取(也许如果你使用高 ECC 冗余对其进行编码),reader 的应用程序中也没有任何东西可以读取数据 URI 图像。只有浏览器可以,使用 CSS 样式。

QR 码是在互联环境中创建的,以便 轻松分享 links

您唯一的选择是将您的图片托管在某个地方,然后在您的二维码中对 URL 进行编码。这些是图片托管的例子:

我不同意。如果你的内部 phone 内存中存储了一张图片,它有一个可以用任何浏览器打开的地址(只需在 Android 上用 chrome 和 /storage/emulated/0/DCIM/Camera/IMG_20181222_160738.jpg 和有效)。问题是找到一个二维码reader,实际上把这个内部地址当作URL来使用,然后直接打开(他们中的大多数尝试使用google查找信息)。但肯定是有可能的。

可以将图像编码成二维码。问题是没有“简单的方法”来显示该图像。您需要安装一个可以解释图像的应用程序(例如通过深度链接),或者您必须依靠另一个协议(例如 vcard)。

Apple 足够好,允许其 OS 级 QRcode reader 解析 vcard 语法。自 vcard supports embedded images 起,您可以在联系人应用程序中将图像显示为个人资料照片。下面的示例代码片段显示了如何创建该 QR 码和生成的(巨大但有效的)QR 码。 :-)

当然有局限性:简而言之,您只能对微小的图像进行编码,尽管您可以通过压缩图像并使用例如webp 或 HEIF。

如何使用嵌入的 base64 编码图像生成 QR 码(使用 qrcode, source of gopher base64):

import qrcode

qrcode.make("BEGIN:VCARD]n"
"VERSION:2.1\n"
"FN: Gopher\n"
"NOTE:Its possible to encode an image into a QR code!\n"
"PHOTO;ENCODING=b;TYPE=PNG:iVBORw0KGgoAAAANSUhEUgAAAEsAA"
"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"
"gAAAABJRU5ErkJggg==\n"
"END:VCARD")