基于Python的个性二维码设计与实现
2019-07-23岐艳芳
岐艳芳
【摘 要】随着扫码支付等应用的普及,二维码在现实生活中的应用越来越普遍。Python作为目前世界上流行的编程语言,具有丰富和强大的库,几乎涵盖了计算机技术的各个领域。本文简述了二维码的结构及绘制过程,着重讲解基于Python生成个性二维码及解析的设计实现过程,较详细阐述了Python第三方库qrcode、zbarlight等库的具体使用,从而生成炫酷个性的二维码艺术图案。
【关键词】二维码;Python;生成;解析
中图分类号: TP391.44;TP393.092文献标识码: A文章编号: 2095-2457(2019)15-0096-002
DOI:10.19694/j.cnki.issn2095-2457.2019.15.046
Design and Implementation of Personal QR Code Based on Python
QI Yan-fang
(School of Software Engineering,Lanzhou Institute of Technology,Gansu Lanzhou 730050,China)
【Abstract】With the popularity of scanning code payment and other applications, The application of QR code in real life is becoming more and more common. Python, as a popular programming language in the world, has rich and powerful libraries, covering almost all fields of computer technology. In this paper, the structure and drawing process of QR code are briefly described, the design and implementation process of generating personalized QR code and parsing based on Python are emphasized, and the concrete use of Python third party library qrcode,zbarlight and other libraries is described in detail. In order to generate cool personality of the QR code art pattern.
【Key words】QR code; Python; Generation; Parsing
随着信息化和工业化“两化融合”的广泛应用和深度结合,二维码在现实生活中的应用越来越普遍,其中扫码支付指手机通过扫描二维码跳转到支付页面,再进行付款。这种新的支付方式,已被越来越多的人接受并使用。去年,在“一带一路”国际合作高峰论坛举行期间,20国青年投票选出中国的“新四大发明”:高铁、扫码支付、共享单车和网购。
1 二维码概述
1.1 二维码
二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息。它能将数字、英文字母、汉字、日文字母、特殊符号(如空格,%,/ 等)、二进制等信息记录到一个正方形的图片中。我们常说的二维码采用QR code 编码制,所以,二维码又被称为 QR code。
QR code 是一种矩阵式二维条码(又称棋盘式二维条码)。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。
1.2 二维码结构
1.2.1 功能图形
功能图形是不参与编码数据的区域。它包含空白区、位置探测图形、位置探测图形分隔符、定位图形和校正图形五大模块。
空白区:顾名思义就是要留空白,以保证QR能被识别。
位置探测图形:类似中文的“回”字。在QR码标识中,位于左上、右上和左下角,作用是协助扫描软件定位QR码并转换坐标系。
位置探测图形分隔符:主要作用是区分功能图形和编码区域。
定位图形:由黑白间隔的格子组成的线条,主要用于指示标识密度和確定坐标系。
校正图形:用于进一步校正坐标系。
1.2.2 编码区域
编码区域是数据进行编码存储的区域,它由格式信息、版本信息、数据和纠错码字三部分构成。
格式信息:存放一些格式化数据的信息,例如容错级别、数据掩码等。
版本信息:规定二维码的规格。QR 码一共有40种规格的矩阵。
数据和纠错码:主要是存储实际数据以及用于纠错码字。
1.3 二维码的绘制过程
二维码的绘制过程简述如下:
(1)在二维码的左上角、左下角、右上角绘制位置探测图形,得到一个7x7的矩阵;
(2)绘制校正图形,得到一个5x5的矩阵;
(3)绘制两条连接三个位置探测图形的定位图形;
(4)在上述图片的基础上,继续绘制格式信息;
(5)接着绘制版本信息;
(6)填充数据码和纠错码到二维码图中;
(7)最后绘制蒙版图案,从而将数据排列成各种图片。
2 基于Python生成个性二维码
要用Python生成二维码,首先需要下载Python的二维码库qrcode。qrcode库是用于生成二维码图像的Python第三方库。qrcode 运行在 Python 3 版本上,该库能生成三种二维码图片:普通二维码、带图片的艺术二维码以及动态二维码。它比较适合直接用于生成二维码图片的场景。
2.1 基本二维码生成
(1)安装Python第三方库。可以使用 pip 方式。但是该库依赖 pillow、numpy 和matplotlib。因此,我们需要先安装依赖库,再安装qrcode库,导入安装库。
(2)读取二维码图片,并将二维码转换为所需大小
qrcode=Image.open('img.png').convert("RGBA")
src_size=(qrcode.size[0], qrcode.size[1])
qrcode=qrcode.resize((99, 99))#将二维码转换为99x99的尺寸
plt.imshow(qrcode)#显示当前的二维码图片
plt.show()
得到结果如图1所示。
(3)读取新的图片,将新的图片转换为合适的尺寸
bg=Image.open('abc.jpeg').convert("RGBA")
if bg.size[0] bg =bg.resize((qrcode.size[0]-24,(qrcode.size[0]-24)*int(bg.size[1]/bg.size[0]))) else: bg=bg.resize(((qrcode.size[1]-24)*int(bg.size[0]/bg.size[1]),qrcode.size[1]-24)) (4)循環二维码图片中各个像素点,其中三个定位图案和有效数据不能替换 for i in range(qrcode.size[0]-24): for j in range(qrcode.size[1]-24):#忽略左上角定位图案 if i<24 and j<24: continue#忽略右上角定位图案 elif i<24 and j>qrcode.size[1]-49: continue#忽略左下角定位图案 elif i>qrcode.size[0]-49 and j<24: continue elif i%3==1 and j%3==1: continue#背景中透明的部分不做处理 elif bg.getpixel((i,j))[3]==0: continue else:#用新图片上的像素替换原有二维码上 qrcode.putpixel((i+12,j+12), bg.getpixel((i,j))) 显示新的二维码图片,得到结果如图2所示。 2.2 动态二维码的生成 生成一个有动态效果的二位码,步骤和简单二维码生成类似,区别在于使用的是二维码加动图GIF。 设计步骤:先将上面的过程封装为一个函数,读取Gif图片,循环扫描Gif图片中的所有帧数,形成循环图片列表,并将结果存到一个新的数组中,最后合并图片组到新的gif文件中。就可得到动态效果的二位码,结果如图3所示。 循环扫描Gif图片中的所有帧数,形成循环图片列表的代码如下: gif=Image.open('fish.gif') duration=gif.info.get('duration', 0) bg_frames=[] try: i=0 while 1: gif.seek(i) gif_copy=gif.copy() if i==0: palette=gif_copy.getpalette() else: gif_copy.putpalette(palette) bg_frames.append(gif_copy.convert("RGBA")) i+=1 except EOFError: pass 3 Python解析二维码图片 解析二维码图片的信息需要使用zbarlight(二维码解析包),首先安装zbarlight库,zbarlight二维码解析包目前仅仅支持Python2.7以下版本。解析二维码信息,返回二维码信息的函数代码如下: import zbar def decode_qrcode(path):#参数path:二维码图片路径 scanner = zbar.ImageScanner()#创建图片扫描对象 scanner.parse_config('enable')#设置对象属性 img =Image.open(path).convert('L')#打开含有二维码的图片 width, height = img.size#获取图片的尺寸 #建立zbar图片对象并扫描转换为字节信息 qrCode=zbar.Image(width, height, 'Y800', img.tobytes()) scanner.scan(qrCode) data= ''#组装解码信息 for s in qrCode: data+=s.data delimg#删除图片对象 return data#输出解码结果 4 结语 Python作为目前世界上流行的编程语言,具有丰富和强大的库,几乎涵盖了计算机技术的各个领域,具有良好的编程生态,在图像处理以及数字识别领域也已经发挥了其重要作用,本文主要探讨了基于Python的二维码生成与解析技术,还可以在此基础上继续扩展,生成更加炫酷的二维码艺术图案,同时该方法也可广泛应用于其他相关领域。 【参考文献】 [1]刘莲,等.基于Android手机的二维码识别生成系统的设计与实现[J].福建电脑,2018(12). [2][美]WESLEY J. CHUN. Core python programmining[M].2012(1). [3]朱亚林.一种基于Python的二维码传输系统的设计与实现[J].中小学电教,2018(12). [4]python.org.http.server—HTTP servers. https://docs.python.org/3.6/library/http.server.html. 2018.