用Python的qrcode模块生成二维码


二维码简称 QR Code(Quick Response Code),学名为快速响应矩阵码,是二维条码的一种,由日本的 Denso Wave 公司于 1994 年发明。现随着智能手机的普及,已广泛应用于平常生活中,例如商品信息查询、社交好友互动、网络地址访问等等。

在Python中生成二维码可以使用 qrcode 模块,由于生成 qrcode 图片需要依赖 Python 的图像库,所以需要先安装 Python 图像库 PIL(Python Imaging Library),不然会遇到 “ImportError: No module named Image” 的错误,但是,因为 PIL库 现在的状态是:

The current free version is PIL 1.1.7. This release supports Python 1.5.2 and newer, including 2.5 and 2.6. A version for 3.X will be released later.

所以,我现在在需要使用Python图像库的时候一般是用 Pillow 模块代替PIL(Pillow is the “friendly” PIL fork,而且Pillow的出现就是为了解决 PIL 的两个问题:1.不兼容 setuptools;2.报告的问题太多,而更新太慢),安装非常简单:

pip install pillow

然后要在import Image的Python代码中将其改为:from PIL import Image 即可。

安装 qrcode 也是类似:

pip install qrcode

在Linux系统下成功安装后,即可以在终端里使用 qr 命令/脚本生成二维码了:

qr "Just a test" > test.png
qr --help

在Python中也可以用如下的方式快速生成:

import qrcode
img = qrcode.make('Some data here')

 

更高级一些的设置需要在Python中引入QRCode类

示例代码1:
#!/usr/bin/env python
#coding=utf-8
import qrcode
qr = qrcode.QRCode(
	version=2,
	error_correction=qrcode.constants.ERROR_CORRECT_L,
	box_size=10,
	border=1
)
qr.add_data("http://ixyzero.com/")
qr.make(fit=True)
img = qr.make_image()
img.save("crazyofme_qrcode.png")

参数 version 表示生成二维码的尺寸大小,取值范围是 1 至 40,最小尺寸 1 会生成 21 * 21 的二维码矩阵,version 每增加 1,生成的二维码就会添加 4 个单位大小,例如 version 是 2,则生成 25 * 25 尺寸大小的二维码。

参数 error_correction 指定二维码的容错系数,分别有以下4个系数:

    • ERROR_CORRECT_L: 7%的字码可被容错
    • ERROR_CORRECT_M: 15%的字码可被容错
    • ERROR_CORRECT_Q: 25%的字码可被容错
    • ERROR_CORRECT_H: 30%的字码可被容错

参数 box_size 表示二维码里每个格子的像素大小。

参数 border 表示边框的格子宽度是多少(默认是4)。

示例代码2(生成带有图标的二维码):
#!/usr/bin/env python
#coding=utf-8
from PIL import Image
import qrcode

qr = qrcode.QRCode(
	version=2,
	error_correction=qrcode.constants.ERROR_CORRECT_Q,
	box_size=10,
	border=1
)
qr.add_data("http://ixyzero.com/blog/")
qr.make(fit=True)
img = qr.make_image()

img = img.convert("RGBA")
img_w, img_h = img.size
factor = 3
size_w = int(img_w / factor)
size_h = int(img_h / factor)

icon = Image.open("apple.png")
icon_w, icon_h = icon.size
if icon_w > size_w:
	icon_w = size_w
if icon_h > size_h:
	icon_h = size_h
icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)

w = int((img_w - icon_w) / 2)
h = int((img_h - icon_h) / 2)
img.paste(icon, (w, h), icon)
img.save("crazyofmeBlog_qrcode.png")

上面这段示例代码会生成包含有本博客链接“http://ixyzero.com/blog/”内容的二维码矩阵(并且嵌入/粘上了自己指定的图片apple.png):

crazyofmeBlog_qrcode

大家可以将其替换为自己的网站图标以体现个性。不过在此之前友情提醒一下参数error_correction 和 粘贴图标的大小尺寸与二维码长宽的比例factor,两者之间有些微妙的关系,别把自己的图标设置的太大导致二维码无法被识别那就得不偿失了。原因是:

二维码的容错系数(上面所指的 error_correction)越高,生成的二维码则可允许的残缺率越大,且二维码的数据主要保存在图片的四个角上,所以在二维码中间放一个小图标,对二维码的识别也是不受多大影响的。

对于插入在二维码上的图标大小,这里指定限制图标的大小尺寸最大是二维码长宽的 1/4,以免残缺太大,影响识别。

还可以借助qrcode模块生成其他类型的图片,比如:SCG、纯Python生成的PNG,可以参考官方说明

参考链接:

 

上面说明了如何用Python制作二维码图片,但是,怎么从已有的二维码图片中读取其中包含的信息呢?通过网上的搜索以及实践,方法有三:

#!/usr/bin/env python
# coding: utf-8

import sys, qrcode

d = qrcode.Decoder()
if d.decode('crazyofme.png'):
    print 'result: ' + d.result
else:
    print 'error: ' + d.error

但是使用的时候会提示错误“AttributeError: ‘module’ object has no attribute ‘Decoder’”,利用IPython查看引入的qrcode模块都有哪些方法:

In [1]: import qrcode

In [2]: qrcode.
qrcode.ERROR_CORRECT_H qrcode.base            qrcode.make
qrcode.ERROR_CORRECT_L qrcode.constants       qrcode.run_example
qrcode.ERROR_CORRECT_M qrcode.exceptions      qrcode.util
qrcode.ERROR_CORRECT_Q qrcode.image
qrcode.QRCode          qrcode.main

很明显,没有Decoder这个方法,估计是安装的qrcode包不同导致,反正后来也没有深究了,因为折腾了好久都没弄好+优先级不高,纯粹玩票性质,所以就不多扯了,以后如果实在有需要再弄吧,先记录一些看到的还不错的链接:

http://ralgozino.wordpress.com/2011/06/13/how-to-create-and-decode-a-qr-code-in-python-using-qrtools/

http://www.pythontr.com/makale.py?tid=177

http://code.google.com/p/qr-code-api/

自己在Windows上编译安装pyqrcode模块的大体方法(坑爹的MinGW):http://stackoverflow.com/questions/9310280/qr-code-decoder-library-for-python


《“用Python的qrcode模块生成二维码”》 有 11 条评论

  1. 让你的二维码,简单一点
    https://sspai.com/post/72727
    `
    # 当你扫码时,手机发生了什么

    二维码的内容是一段文本,这些文本通过不同的前缀可以被手机识别为不同的数据类型。

    以 iPhone 为例,使用自带的相机,或其它二维码识别 app 对二维码进行扫描的时候,会首先判断识别到的内容前缀,然后通过相应的 app 来打开该内容。如果是纯文本,则会使用 Safari 浏览器进行搜索。

    而文本如果以 https:// 开头,就代表了该二维码是一个网址,在进行扫码的时候会自动通过 Safari 打开该链接。其它超链接诸如 mailto:[email protected](发邮件)、tel:10010(打电话)、smsto:10010(发短信),以及 URL Scheme 等这类第三方应用接口,也会让手机调用相关的 app 来执行。而通过 WIFI: 这个前缀还可以使用户直接扫码联网(对于可以共享 WiFi 密码的安卓手机,通常会生成一个二维码供其他手机扫描,而通过微信扫码后则可以看到其中的 WiFi 密码)。

    但是多数情况下我们用来扫码的工具都是微信,而微信支持的只有文本与网页链接,且仅会调用微信内置的浏览器打开网址,这就大大限制了二维码的使用场景,本文也仅针对网址类的二维码进行简化的讨论。

    # 什么决定了二维码的复杂度

    影响二维码复杂度的两个属性分别是「内容长度」与「容错率」。

    内容长度:顾名思义,二维码中所包含的文本长度决定了二维码画面的复杂度,文本越长二维码越复杂,反之则越简单。

    容错率:二维码的容错率设置为四个等级:L – 低容错率、M – 中等容错率、Q – 较高容错率、H – 高容错率,其中级别为 L 的容错率为 7%,M 容错率为 15%,Q 容错率为 25%,H 容错率为 30%,假如一个二维码在生成时设定容错率为 L 级别,那么生成的二维码被遮挡的内容超过 7% 就无法识别。而越是高容错的二维码看起来越是复杂,我们最常见的二维码多数采用了 M 等级的容错率,保证一定容错的情况下尽可能使二维码趋于简单。

    # 为何要简化二维码

    美观:作为一名平面设计师,简单的二维码比起密密麻麻的复杂二维码看起来更为透气,也更容易与其它设计元素搭配。所以我在处理包含二维码的设计工作时,会尽量重制二维码让其变的更为简单美观。

    提高识别度:前文提到说越是复杂的二维码容错越高,这里并非背道而驰。相较于高容错率,更简单的低容错二维码在线下介质的适应性上,要好于更复杂的二维码。有时候我们的二维码扫不出,不是因为二维码某个位置损毁脏污,而是因为部分介质较低的印刷精度,以及扫描距离的关系,导致低端的手机镜头整体无法识别。

    二次创作:随着二维码逐渐被重视,一些专业的设计师,将二维码重新设计,使其看起来更具创意却依然能保证功能性。而这些再次创作的二维码越是简单,就越容易被重画。
    `

  2. Mac 下 终端也能生成二维码了
    https://droidyue.com/blog/2022/05/30/generate-qrcode-in-terminal-on-mac-or-linux/
    `
    # 安装
    brew install qrencode

    # 命令手册
    man qrencode

    qrencode – Encode input data in a QR Code and save as a PNG or EPS image.

    qrencode [-o FILENAME] [OPTION]… [STRING]

    -t {PNG,PNG32,EPS,SVG,XPM,ANSI,ANSI256,ASCII,ASCIIi,UTF8,UTF8i,ANSIUTF8,ANSIUTF8i,ANSI256UTF8}
    –type={PNG,PNG32,EPS,SVG,XPM,ANSI,ANSI256,ASCII,ASCIIi,UTF8,UTF8i,ANSIUTF8,ANSIUTF8i,ANSI256UTF8}
    specify the type of the generated image. (default=PNG)

    -l {LMQH}, –level={LMQH}
    specify error correction level from L (lowest) to H (highest). (default=L)

    -m NUMBER, –margin=NUMBER
    specify the width of margin. (default=4)

    # 使用样例
    qrencode -t ANSIUTF8 https://ixyzero.com/
    `

  3. Defining a Custom URL Scheme for Your App (Use specially formatted URLs to link to content within your app)
    https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app

    Complete List of iOS URL Schemes for Apple Apps and Services (Always-Updated)
    https://medium.com/@contact.jmeyers/complete-list-of-ios-url-schemes-for-apple-apps-and-services-always-updated-800c64f450f

    Complete List of iOS URL Schemes for Apple Settings (Always-Updated)
    https://medium.com/@contact.jmeyers/complete-list-of-ios-url-schemes-for-apple-settings-always-updated-20871139d72f

    Find the URL scheme of an app on my iPhone
    https://stackoverflow.com/questions/52318063/find-the-url-scheme-of-an-app-on-my-iphone

    URL Scheme 查询指南
    https://sspai.com/post/66334

    含参数的 URL Scheme 收集.md
    https://gist.github.com/JamesHopbourn/046bc341e7debfd0c86e3b388d983c53

    如何寻找一个 App 的 URL Schemes
    https://zhuanlan.zhihu.com/p/53439246

    URL Schemes 收集整理
    https://jiejinghe.com/posts/7887440252

  4. […] 从“让你的二维码,简单一点”这篇文章开始说起,里面有一段内容是介绍【当你扫码时,手机发生了什么】的,对于iPhone来说,其实是URL Scheme的概念,然后又提到了二维码的几个使用场景,让我想起了以前看过的几篇帖子/文章(【用Python的qrcode模块生成二维码】/【过年回老家,亲朋好友来串门使用 WiFi 太麻烦,写了一个 WiFi 管理和分享的小工具,欢迎大家使用】/【Mac 下 终端也能生成二维码了】),觉得里面有些内容还挺有意思的,而且相互之间还可以串起来,所以简单汇总记录一下,方便后面有需要的时候参考。 […]

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注