目 录

摘 要 I
Abstract II
第一章 绪论 1
1.1 课题背景 1
1.2 研究现状 1
1.3 工作环境和背景 2
1.3.1 操作系统 3
1.3.2 编程语言 3
1.3.3编码库和解码库 3
1.3.4 网页web框架 4
1.4 主要工作和内容安排 4
第二章 QR二维码概述 6
2.1 QR二维码的结构 6
2.1.1 相关名词概念 6
2.1.2 图像结构 6
2.1.3 特点 9
2.2 QR二维码的编解码过程简介 9
2.2.1 编码过程 9
2.2.2 解码过程 10
第三章 程序设计 12
3.1 前端程序 12
3.2 后端程序 16
3.3 程序运行流程 21
3.3.1 单次录入 21
3.3.2 批量生成 22
3.3.3 解码 23
第四章 结果与分析 25
4.1 可用性验证 25
4.2 测试过程与结果 25
4.3 分析 26
第五章 总结与展望 27
5.1 总结 27
5.2 展望 27
参考文献 28
致谢 30
1.3.2 编程语言
网页采用Html(HyperText Markup Language)语言编写,版本Html 5。
由于整个运维部门的运维脚本正在准备使用Python语言进行改写,以后的主用脚本也将是Python。Python是一种面向对象的脚本语言,1991年由荷兰人Guido van Rossum首次公开发行。Python具有简洁的语法规则,易读易改,扩展性很好。并且我之前也学习过一些Python语言,对Python有一些基础,因此,综合考虑,决定选用Python语言来编写程序。在本课题中,使用的Python版本为2.7.6,Ubuntu Kylin14.04 64位操作系统自带,无需额外安装。

1.3.3编码库和解码库
本课题由于侧重于应用层次,因此决定选择已有的QR二维码的编码库和解码库。Python语言具有非常良好的扩展性,有非常丰富的库可以利用。在Python的官方包管理网站,https://pypi.python.org/pypi上可以找到各种各样的库。经过查找和了解,确定使用qrcode和zbar两个Python库完成QR二维码的编码和解码工作。课题中使用到的Qrcode版本为4.0.4,zbar版本为0.10 。由于系统默认不带有这两个库,因此需要自行安装。
库模块的安装步骤为:
1.先安装Python的包管理程序pip。在终端命令行下键入命令进行安装:
$ sudo apt-get install python-pip
2.通过pip安装qrcode和zbar:
$ sudo pip install qrcode zbar
安装好包之后,在python程序中使用时只需import qrcode zbar即可。

1.3.4 网页web框架
课题使用网页形式来表现程序的功能,那么HTTP服务器是不可少的。由于本课题规模较小,处于开发阶段,离真正放到服务器上运行还有一段距离,因此决定选用Web框架自带的开发服务器运行和调试,就不再安装Apache、Nginx等专业的HTTP服务器了。
在Web框架的选择上,我选用了web.py框架。Web.py是一个基于Python语言的轻量级框架,相比于其他框架具有简单易用,扩展简单的优点。课题中使用的web.py版本为0.37。由于该框架系统默认不安装,本文转载自http://www.biyezuopin.vip/onews.asp?id=14562因此需要另外安装。安装过程类似于qrcode和zbar,在命令行键入命令:
$ sudo pip install web.py
即可成功安装web.py模块,当需要在程序中使用时,只需import web即可使用web.py模块的相关功能。
1.4 主要工作和内容安排
本文的主要内容包括:

  1. QR二维码的由来和优点
    介绍QR二维码的由来,发展过程以及相比于其他二维码的优点等。
  2. QR二维码的结构
    介绍QR二维码的图形构成,包含的内容,特性和规范标准。
  3. 建立网页
    以网页的形式提供将资产信息生成QR二维码的功能,用户在网页上提交资产信息并提交,网页将信息交给后台程序处理并返回结果。
  4. Python后台程序
    用户通过网页提交的信息从前端传递给后台处理程序,后台程序根据资产信息生成对应的二维码并保存到指定位置。
    本文的内容安排:
    第二章主要简介QR二维码的特点和格式规范等内容。
    第三章主要进程程序设计,包括前端网页和后台程序的功能,以及整个程序的运行流程。
    第四章主要是对整个程序的分析,展示程序的运行结果,对过程中出现的错误进行分析和总结。
    第五章是总结与展望,主要对全文所做的工作进行了总结。
#!/usr/bin/env python
# -*- coding: utf-8 -*-import cStringIO
import urllib
import web
import qrcode
import zbar
try:from PIL import Image
except ImportError:import Image
from lib.mime import ImageMIME
from lib import charsetclass Index(object):"""首页"""def GET(self):msg = "解码后的信息将显示在这里。"return render.index(msg)class QR(object):"""处理传来的数据并显示 QR Code 二维码图片"""def handle_parameter(self, chl, chld, chs):"""处理表单提交的变量chl=编码内容chs=图片尺寸chld=纠错级别"""if len(chl) > 2953:  # V40-L最大容量raise web.badrequest()chld = chld.upper()# chld 是非必需参数,有默认值if not chld:chld = 'M|1'# 处理 chld 参数值chld = chld.split('|')if len(chld) == 2:  # e.g. 'M|2'try:border = int(chld[1])  # 二维码与图片的边距except:border = 1elif len(chld) == 1:  # e.g. 'M'border = 1level = chld[0]  # 纠错级别if level not in ['L', 'M', 'Q', 'H']:level = 'M'  # 默认纠错级别if border < 0:border = 1try:chs = chs.lower()size = tuple([int(i) for i in chs.split('x')])except:raise web.badrequest()else:# 处理负数及零的情况,# 同时限制图片大小,防止图片太大导致系统死机if (size[0] * size[1] == 0 or size[0] < 0 or size[1] < 0 or (size[0] > 600) or size[1] > 600):raise web.badrequest()# 由于生成的二维码图片是个正方形,所以由 size 的最小值组成的正方形# 来限制二维码图片大小square_size = size[0] if size[0] <= size[1] else size[1]# L,M,Q,H 纠错级别下 1~40 版本的最大容量(Binary)l_max = [17, 32, 53, 78, 106, 134, 154, 192, 230, 271, 321,367, 425, 458, 520, 586, 644, 718, 792, 858, 929,1003, 1091, 1171, 1273, 1367, 1465, 1528, 1628,1732, 1840, 1952, 2068, 2188, 2303, 2431, 2563,2699, 2809, 2953]m_max = [14, 26, 42, 62, 84, 106, 122, 152, 180, 213, 251,287, 331, 362, 412, 450, 504, 560, 624, 666, 711,779, 857, 911, 997, 1059, 1125, 1190, 1264, 1370,1452, 1538, 1628, 1722, 1809, 1911, 1989, 2099,2213, 2331]q_max = [11, 20, 32, 46, 60, 74, 86, 108, 130, 151, 177,203, 241, 258, 292, 322, 364, 394, 442, 482, 509,565, 611, 661, 715, 751, 805, 868, 908, 982, 1030,1112, 1168, 1228, 1283, 1351, 1423, 1499, 1579, 1663]h_max = [7, 14, 24, 34, 44, 58, 64, 84, 98, 119, 137, 155,177, 194, 220, 250, 280, 310, 338, 382, 403, 439,461, 511, 535, 593, 625, 658, 698, 742, 790, 842,898, 958, 983, 1051, 1093, 1139, 1219, 1273]# 根据纠错级别及字符数选定版本。if level == 'L':for i in l_max:if len(chl) < i:version = l_max.index(i) + 1breakelse:  # 如果超出了该纠错级别所能处理的最大字符数,抛出错误异常raise web.badrequest()error_correction = qrcode.constants.ERROR_CORRECT_Lelif level == 'M':for i in m_max:if len(chl) < i:version = m_max.index(i) + 1breakelse:raise web.badrequest()error_correction = qrcode.constants.ERROR_CORRECT_Melif level == 'Q':for i in q_max:if len(chl) < i:version = q_max.index(i) + 1breakelse:raise web.badrequest()error_correction = qrcode.constants.ERROR_CORRECT_Qelif level == 'H':for i in h_max:if len(chl) < i:version = h_max.index(i) + 1breakelse:raise web.badrequest()error_correction = qrcode.constants.ERROR_CORRECT_Hbox_size = square_size / ((version * 4 + 17) + border * 2)# print box_sizeargs = {'version': version,'error_correction': error_correction,'box_size': box_size,'border': border,'content': chl,'size': size}return argsdef show_image(self, **args):"""返回图片 MIME 及 内容,用于显示图片"""version = args['version']error_correction = args['error_correction']box_size = args['box_size']border = args['border']content = args['content']size = args['size']if box_size == 0:im = Image.new("1", (1, 1), "white")  # 空白图片else:# 生成二维码qr = qrcode.QRCode(version=version,error_correction=error_correction,box_size=box_size,border=border,)print "qr.add_data(content) ,content is :"print contentqr.add_data(content)qr.make(fit=True)im = qr.make_image()# 将生成的二维码图片保存到内存中,用于下面的缩放处理temp_img = cStringIO.StringIO()im.save(temp_img, 'png')img_data = temp_img.getvalue()  # 获取图片内容im = Image.open(cStringIO.StringIO(img_data))x, y = im.size  # 生成的二维码图片大小rx, ry = size  # 用户请求的图片大小new_im = Image.new("1", (rx, ry), "white")# 将二维码图片粘贴到空白图片中并保持二维码图片居中paste_size = ((rx - x) / 2, (ry - y) / 2, (rx - x) / 2 + x,(ry - y) / 2 + y)  # 粘贴位置new_im.paste(im, paste_size)  # 若位置全为负值则缩放并填充整个目标图片temp_img.write('')new_im.save(temp_img, 'png')  # 保存粘贴好的图片new_im_data = temp_img.getvalue()# 图片 MIME 类型MIME = ImageMIME().get_image_type(new_im_data)temp_img.close()  # 释放内存return (MIME, new_im_data)def GET(self):querys = web.ctx.env['QUERY_STRING']if querys == '':''' querys like this : chl=aaa&chs=350x350&chld=M type is str'''return web.badrequest()querys = querys.split('&')''' querys turn to : ['chl=aaa','chs=350x350','chld=M'] type is list'''print "querys is:"print querystry:# 分割参数,能处理类似 'chl===hello&chls=200x200&chld=M|3'values = [x.split('=', 1) for x in querys]'''values like this : [['chl', 'aaa'], ['chs', '350x350'], ['chld', 'M']] 可以处理由于多个=号引起的解析错误,如: chl===wo'''print "values is:"print valuesquerys = {}chl = ''temp_list = []for n in range(len(values)):temp_list.append(values[n][1])chl = ':'.join(temp_list)print "chl is :"print chlexcept:return web.badrequest()#chl = querys.get('chl')chl = chl.replace('+', '%20') # 解决空格变加号,替换空格为 '%20'chs = '350x350'chld = 'M|1'print "chl type is :"print type(chl)chl = urllib.unquote(chl)print "urllib.unquote(chl) is:"print chlchl = charset.encode(chl)  # 将字符串解码然后按 utf8 编码print "charset.encode(chl)"print chlif chl is None:return web.badrequest()args = self.handle_parameter(chl, chld, chs)print "args is :"print argsMIME, data = self.show_image(**args)web.header('Content-Type', MIME)# save img file {tagfile = open('tags/' + chl.split(':')[0] + '.png', 'wb')tagfile.write(data)tagfile.closeprint "save data success!"print "data type is:" ,print type(data)# }return datadef POST(self):"""处理 POST 数据"""querys = web.input()print "querys.chl="print querys.chlprint "querys.chl type is :"print type(querys.chl)print "querys.chs ="print querys.chschl = querys.chlchl_list = chl.split('\n')print "chl_list is :"print chl_listchs = querys.chsfor chl in chl_list:if not chl:passelse:if chl is None or chs is None:return web.badrequest()chld = querys.chldchl = chl.replace('\t',':')print "chl = chl.replace('\t',':')"print chlargs = self.handle_parameter(chl, chld, chs)MIME, data = self.show_image(**args)web.header('Content-Type', MIME)# save img file {tagfile = open('tags/' + chl.split(':')[0] + '.png', 'wb')tagfile.write(data)tagfile.closeprint "save data success!"print "data type is:" ,print type(data)# }return dataclass Decode(object):"""解码"""def decodeQR(self, fileName):'''解析QR码'''scanner = zbar.ImageScanner()scanner.parse_config("enable")pil = Image.open(fileName).convert('L')width, height = pil.sizeraw = pil.tostring()image = zbar.Image(width, height, 'Y800', raw)scanner.scan(image)data = ''for symbol in image:data+=symbol.datadel(image)print "decodeQR data is:"print datareturn datadef POST(self):img = web.input(qrimg={})print type(img)# save img file {save_path = './uploads'fname=img['qrimg'].filenameimg_save = open(save_path + '/' + fname, 'wb')img_save.write(img.qrimg.file.read())img_save.close()# }img_read = save_path + '/' + fnamemsg = self.decodeQR(img_read)try:   msg = msg.decode('utf-8').encode('sjis').decode('utf-8')except UnicodeEncodeError:   passprint "The info in QR is :"print msgreturn render.index(msg)if __name__ == '__main__':web.config.debug = Trueurls = ('/', 'Index', '/qr', 'QR',  '/decode', 'Decode', '/.*', 'Index')# 应用模板render = web.template.render('templates')app = web.application(urls, globals())app.run()
















Python基于二维码实现的在线编解码系统相关推荐

  1. 一种基于二维码的双向摆渡数据交换方案

    应用场景 提供一种基于二维码的双向摆渡方法及系统,充分保证消息的可靠性和高性能,实现物理隔离网络间的信息传递,借以实现业务功能.实质是服务端将数据转换为二维码显示在电脑屏幕中,客户端通过工业级摄像头进 ...

  2. Python案例笔记 | 用python制作二维码

    基于Python3版本的学习. 要用python制作二维码,需用python第三方库:MyQR . 安装myqr模块 首先需要在cmd中用pip安装myqr模块. win + r 打开运行命令,输入& ...

  3. python生成二维码、动态二维码 和 而二维码解析

    python生成二维码.动态二维码 和 而二维码解析(8-20190129) 文章目录: 一.二维码介绍 二. 就是为了好玩所以想搞一下二维码,"好玩",少年醒醒,不要骗自己啦,起 ...

  4. 互联网 4 大发明之二维码,你如何使用 Python 生成二维码?

    阅读文本大概需要 8 分钟. 新时代,人们有人信新的追求,自然而然会有新发明的诞生.去年,在"一带一路"国际合作高峰论坛举行期间, 20 国青年投票选出中国的"新四大发明 ...

  5. python生成二维码_python生成二维码的实例详解

    python生成二维码的实例详解 版本相关 操作系统:Mac OS X EI Caption Python版本:2.7 IDE:Sublime Text 3 依赖库 Python生成二维码需要的依赖库 ...

  6. Python生成二维码的操作方法

    使用的是qrcode库,在使用之前需要安装此库 pip install qrcode 网址 #python生成二维码 import qrcode img=qrcode.make("http: ...

  7. 使用 Python 生成二维码

    本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享 新时代,人们有人信新的追求,自然而然会有新发明的诞生.去年,在"一带一路"国际合作高峰论坛举行期间, 20 国 ...

  8. 如何用Python生成二维码

    使用Python做二维码需要一个非常简单的模块--MyQR,这个模块相比于QRcode更加简单,功能也是特别强大,下面介绍一种生成简单二维码的方式. 安装方式 利用pip安装. 使用方式 首先导入. ...

  9. 初学python制作二维码以及最新感悟

    初学python制作二维码 一.安装Python 推荐百度经验链接. 二.安装pip模块 Python 3.4以后版本默认安装了pip,但是由于不是最新故需要升级,pip的升级命令为(开始->c ...

最新文章

  1. Dart微基准测试第一部分
  2. 第十三章、创建接口和定义抽象类
  3. SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】
  4. 精通JavaScript攻击框架:AttackAPI
  5. Android怎么导入Moudle
  6. Elements in iteration expect to have v-bind:key directives错误的解决办法
  7. 天猫方糖 篇一:新版天猫放糖改造立体声
  8. sql怎么修改服务器角色,sql角色服务器的设置
  9. springboot传入json和文件_Spring Boot之 Controller 接收参数和返回数据总结(包括上传、下载文件)...
  10. 类__slots__与__dict__用法
  11. Date类与DateFormat类
  12. 上了年纪的酒店,如何“鸟枪换炮”?
  13. 封装class,让className可以在IE8及其以下版本的浏览器中使用
  14. 白天 996, 我还能晚上669!
  15. Alexa 账号注册的多种方法
  16. openGL-设计交互平面图形(旋转、平移、缩放)
  17. 市场营销中4P对应4C理论
  18. 集成显卡 独立显卡 带 双显示器
  19. 华硕FN键补充应用下载-可以在windows的应用商店寻找进行下载,安装。-asus-keyboard Hotkeys
  20. 用户输入商品价格和商品数量,以及收货地址,可以自动打印订单信息 分析:

热门文章

  1. Oracle XE版安装与用户操作
  2. 无线计算机通信网络安全,4G通信技术的无线网络安全通信-网络安全论文-计算机论文(7页)-原创力文档...
  3. 读书印记 - 《大学潜规则:谁能优先进入美国顶尖大学》
  4. 新商用密码产品认证梳理——参考资料篇
  5. HDU4801 转魔方、DFS模拟
  6. oracle表删除提示对象不存在,查询表结构报“ORA-04043: 对象XXX不存在”解决-Oracle...
  7. Python 批量合并多个txt文件
  8. java连接sftp工具类
  9. 2023NPDP产品经理认证如何考取?
  10. 实战:k8s中网络策略实验(成功测试-博客输出)-20211005