vlambda博客
学习文章列表

Python在线生成二维码,是时候展现真正的技术了

通   知




本文内容摘自《Python数据科学零基础一本通》,有删改。

目前流行的二维码(QR code)是1994年由日本Denso-Wave公司发明的。英文字中 QR 所代表的意义是Quick Response,即快速反应。QR code最早用于汽车制造商追踪零件,目前已应用于各行各业。它的最大特点是可以存储比普通条形码更多的数据,同时也无须对准扫描仪。

扫码限时优惠购书


1

二维码的结构
二维码由 边框区 数据区 所组成,数据区由定位标记、校正图块、版本信息、原始信息、容错信息所组成,这些信息经过编码后产生二进制字符串,白色格子代表 0,黑色格子代表 1,这些格子一般又称作模块。
其实经过编码后,还会使用屏蔽(masking)方法将原始二进制字符串与屏蔽图案(Mask Pattern)做 XOR 运算,产生实际的编码,经过处理后的 QR code 辨识率将更高。QR code基本外观如下 :

Python在线生成二维码,是时候展现真正的技术了

  • 边框区:也可以称为非数据区,主要是避免 QR code 周围的图像影响辨识

  • 定位标记:在上述图片中,左上、左下、右上是定位标记,外型类似“回”字,在使用 QR code 扫描时我们可以发现不用完全对准也可以,主要是这 3 个定位标记在帮助扫描定位。

  • 校正图块:主要用于校正辨识。

  • 容错修功能QR code 有容错功能,所以如果 QR code 有破损,有时仍然可以读取,一般 QR code 的面积越大,容错能力越强。

Python在线生成二维码,是时候展现真正的技术了
2

二维码的容量
QR code 目前有 40 个不同版本,版本 1 是 21×21 个模块。模块是 QR code 最小的单位,每增加一个版本,长宽各增加 4 个模块,所以版本 40 是由 177×177 个模块组成,下列是以版本 40 为例做容量解说。

Python在线生成二维码,是时候展现真正的技术了

3

建立二维码的基本知识
使用前需安装模块 :
pip install qrcode
常用的几个方法如下 :

img = qrcode.make(" 网址数据 ") # 产生网址数据的 QR code 对象 img
img.save("fi lename") # fi lename 是储存 QR code 的文件名
 
程序实例1
建立 http://www.deepstone.com.tw 的 QR code,这个程序会先列出 img 对象 的数据形态,同时将此对象存入 out17_23.jpg 内。
Python在线生成二维码,是时候展现真正的技术了

程序实例2
建立“Python 王者归来”字符串的 QR code。

Python在线生成二维码,是时候展现真正的技术了

4

细看 qrcode.make( ) 方法


上述我们使用 qrcode.make( ) 方法建立 QR code,这是使用预设方法建立 QR code,实际qrcode.make( ) 方法内含 3 个子方法,整个方法原始码如下 :

def make(data=None, **kwargs):
qr =qrcode. QRCode(**kwargs)  # 设置条形码格式
qr.add_data(data) # 设置条形码内容
return qr.make_image( ) # 建立条形码图片
 
1)设置条形码格式
它的内容如下 :
qr = qrcode.QRCode(version, error_correction, box_size, border,
image_factory,mask_pattern)

下列是此参数解说 :
version :QR code 的版次,可以设置 1 ~ 40 的版次。
error_correction :容错率,可选 7%、15%、25%、30%,参数如下 :
qrcode.constants.ERROR_CORRECT_L :7%
qrcode.constants.ERROR_CORRECT_M :15%(预设)
qrcode.constants.ERROR_CORRECT_Q :25%
qrcode.constants.ERROR_CORRECT_H :30%
box_size :每个模块的像素个数。
border :边框区的厚度,预设是 4。
image_factory :图片格式,默认是 PIL。
mask_pattern :mask_pattern 参数是 0 ~ 7,如果省略会自行使用最适当的方法。
 
2)设置条形码内容
qr.add_data(data)  # data 是所设置的条形码内容
 
3)建立条形码图片
img = qr.make_image([fi ll_color], [back_color], [image_factory])
预设前景是黑色,背景是白色,可以使用 fi ll_color 和 back_color 分别更改前景和背景颜色,最后建立 qrcode.image.pil.PilImage。

程序实例
建立“明志科技大学”黄底蓝字的 QR code。
Python在线生成二维码,是时候展现真正的技术了


5

建立含有二维码的名片
有时候可以看到有些人的名片上有 QR code,使用手机扫描后便能得到此名片的信息。为了完成此工作,我们必须使用 vCard(virtual card)格式。它的数据格式如下 :
BEGIN:VCARD
特定属性数据
END:VCARD
上述数据必须建在一个字符串上,未来只要将此字符串当作 QR code 数据即可。下列是常用的属性 :

Python在线生成二维码,是时候展现真正的技术了

程序实例 
建立个人名片信息。