基于Python 的二维码生成与识别
2020-08-11管小卫
管小卫
(江苏财经职业技术学院,江苏 淮安223003)
1 二维码概述
二维码(2-dimensional bar code)又称二维条码,是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。我们常说的二维码为QR Code,QR 全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code 条形码能存更多的信息,也能表示更多的数据类型。QR code 是一种矩阵式二维条码(又称棋盘式二维条码)。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。
2 二维码的结构
我们的目的是要使用Python 生成QR 码,那我们需要先了解二维码(QR 码)的结构。根据标准(ISO/IEC 18004),我们可以了解到QR 码结构如图1 所示。
图1 QR 码结构图
2.1 功能图形
功能图形是不参与编码数据的区域。它包含空白区、位置探测图形、位置探测图形分隔符、定位图形、校正图形五大模块。
空白区:空白区顾名思义就是要留空白。因此,这里不能有任何图样或标记,这样才能保证QR 能被识别。
位置探测图形:这个有点类似中文的“回”字。在QR 码中有个这样的标识,它分别位于左上、右上和左下角,作用是协助扫描软件定位QR 码并转换坐标系。我们在扫描二维码的时候,不管是竖着扫、横着扫、斜着扫都能识别出内容,主要是它的功劳。
位置探测图形分隔符:主要作用是区分功能图形和编码区域。
定位图形:它由黑白间隔的格子组成的线条,主要用于指示标识密度和确定坐标系。原因是QR 码一共有40 个版本,也就是说有40 种尺寸。每种二维码的尺寸越大,扫描的距离就越远。
校正图形:只有Version 2 及以上的QR 码有校正标识,校正标识用于进一步校正坐标系。
2.2 编码区域
编码区域是数据进行编码存储的区域,它由格式信息、版本信息、数据和纠错码字三部分构成。
格式信息:所有尺寸的二维码都有该信息。它存放一些格式化数据的信息,例如容错级别、数据掩码,和额外的自身 BCH容错码。
版本信息:版本信息是规定二维码的规格。前面讲到QR 码一共有40 种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本的每边增加4个模块。
数据和纠错码:主要是存储实际数据以及用于纠错码字。
3 使用Python 生成二维码
首先需要使用pip 命令安装pillow 、numpy 和matplotlib库,然后再安装二维码库qrcode ,该库是用于生成二维码图像的Python 第三方库。qrcode 运行在Python 3 版本上,利用该库能生成多种二维码图片:如普通二维码、高级二维码以及带logo的二维码等。
3.1 普通二维码的生成
例如,生成指向百度的二维码,用户扫描后会访问百度首页。代码如下:
生成二维码如图2 所示,通过手机扫一扫二维码就跳转到百度首页。
图2 普通二维码
3.2 高级二维码的生成
设置二维码颜色、大小等参数,实例化参数含义如下:
代码如下:
生成二维码如图3 所示。
图3 高级二维码
3.3 生成带logo 的二维码
生成带logo 的二维码的过程基本与普通二维码生成过程相似,其主要的功能就是对logo 图片进行处理,调整logo 的尺寸使其符合所需的大小,然后通过paste 方法将其粘贴到二维码的中心位置。示例代码如下:
生成二维码如图4 所示。
图4 带log 的二维码
Table 1
4 使用zxing 识别二维码
在python 下二维码识别,目前主要有三个模块:zbar 、zbarlight、zxing。zxing 比zbarlight(zbar)的识别能力稍强。使用pip命令安装zxing 库。代码如下:
通过使用微信扫一扫功能,可以快速识别出二维码中的内容。
5 结论
本文主要探讨了基于Python 的二维码生成与识别技术,通过qrcode 库和zxing 库来生成和识别二维码可知:(1)二维码本质是图形,可以使用数字图像技术来处理。(2)使用qrcode 库可以生成不同类型二维码,它们的处理方式也相似,还可以在此基础上进一步扩展,生成更加炫酷的动态二维码图案。(3)二维码具有一定的存储能力,在读取信息过程中,可以执行一定的解释性代码实现跳转,因此存在一定的风险。(4)使用zxing 库比zbarlight 库、zbar 库识别效果好。