今天给大家带来一个简单的Python应用实验:生成个性二维码。

实验内容:
通过调用MyQR接口来实现生成个人所需二维码,并可以设置二维码的大小、是否在现有图片的基础上生成、是否生成动态二维码。主要面向Python3初学者。

知识点:
Python3基础
MyQR库

可以实现:
普通二维码

带图片的艺术二维码

动态二维码

实验环境:

  • python-3.5.2

  • MyQR-2.3.1

实验准备

创建环境

打开终端,进入 Code 目录,并将其作为我们的工作目录。

$ cd Code

下载MyQR

$ sudo pip3 install MyQR

下载所需资源文件并解压

Code/ $ wget http://labfile.oss.aliyuncs.com/courses/1126/Sources.zip  #这里提供制作二维码所需要的图片资源Code/ $ unzip Sources.zip

FreeImage

如果你使用的是虚拟环境,会缺少了一些FreeImage依赖,可以在这里手动添加。如果不是虚拟环境可以跳过此步。

shiyanlou根目录里打开终端:

shiyanlou/ $ mkdir .imageio && cd .imageio.imageio/ $ mkdir freeimage && cd freeimage
freeimage/ $ wget http://labfile.oss.aliyuncs.com/courses/1126/libfreeimage-3.16.0-linux64.so

实验步骤

接下来,我们会自己制作普通二维码、带有图片的艺术二维码和动态二维码。


普通二维码

确保当前目录为Code,在命令行中输入 python3 ,进入 python3 环境:

Code/ $ python3

在 python3 环境中输入以下代码:

>>>from MyQR import myqr>>>myqr.run('https://www.shiyanlou.com')

大功告成,那么来看一看自己制作的第一张二维码图片吧!

先退出python3环境

>>>quit()

再使用火狐浏览器预览

Code/ $ firefox qrcode.png

效果图:

快快拿起手机扫一扫,看看是否有效,若成功,将跳转到实验楼主页。

下面我们来详细的讲解一下 myqr.run() 函数里面的参数

参数

含义

详细

words

二维码指向链接

str,输入链接或者句子作为参数

version

边长

int,控制边长,范围是1到40,数字越大边长越大,默认边长是取决于你输入的信息的长度和使用的纠错等级

level

纠错等级

str,控制纠错水平,范围是L、M、Q、H,从左到右依次升高,默认纠错等级为'H'

picture

结合图片

str,将QR二维码图像与一张同目录下的图片相结合,产生一张黑白图片

colorized

颜色

bool,使产生的图片由黑白变为彩色的

contrast

对比度

float,调节图片的对比度,1.0 表示原始图片,更小的值表示更低对比度,更大反之。默认为1.0

brightness

亮度

float,调节图片的亮度,其余用法和取值与 contrast 相同

save_name

输出文件名

str,默认输出文件名是"qrcode.png"

save_dir

存储位置

str,默认存储位置是当前目录


带图片的艺术二维码

光是二维码,是否太单调了呢?没关系,我们能加上我们想要的图片,使二维码更具辨识度!我们准备了实验楼(蓝桥云课前身)的Logo:

实验楼(蓝桥云课前身)Logo图片:

当然,Sources文件夹里有更多的图片,你也可以选择你个人喜爱的一张来制作艺术二维码!

让我们将这张图加入到我们的二维码中,加入过程需要在参数里指定实验楼Logo图片的地址,我们也要设置新图片的保存名,以免和上一张二维码图片冲突。

>>>myqr.run(...    words='https://www.shiyanlou.com',...    picture='Sources/shiyanlouLogo.png',...    save_name='artistic.png',...)

再次退出python3环境

>>>quit()

使用火狐浏览器打开图片

Code/ $ firefox artistic.png

黑白实验楼Logo二维码:

黑白的,似乎不是那么好看,彩色的如何呢?实现彩色也非常简单,在参数里将 colorized 参数值设为 True

>>>myqr.run(...    words='https://www.shiyanlou.com',...    picture='Sources/shiyanlouLogo.png',...    colorized=True,...    save_name='artistic_Color.png',...)

打开图片

Code/ $ firefox artistic_Color.png

彩色实验楼Logo二维码:

好看多了,但我们的实验并没有到此为止哦!


动态二维码

其实生成动态二维码,并没有想象的那么复杂。在这里,我们使用美丽的新垣结衣GIF!

新垣结衣GIF:

在生成动态二维码的过程中,值得注意的一点是,我们生成保存的文件也必须是.gif 格式哟。让我们赶快开始!

>>>myqr.run(...    words='https://www.shiyanlou.com',...    picture='Sources/gakki.gif',...    colorized=True,...    save_name='Animated.gif',...)

新鲜出炉的动图,新垣结衣动态二维码:

效果很不错呢,拿起手机试着扫扫看。


MyQR源码解读

MyQR源码来自于github上的sylnsfar/qrcode项目,大家可以通过克隆的方式下载源码来学习,可以使用如下命令行:

Code/ $ git clone https://github.com/sylnsfar/qrcode.git

如果下载速度较慢的话,也可以下载我们服务器上面的源码,可以通过如下命令:

Code/ $ wget http://labfile.oss.aliyuncs.com/courses/1126/qrcode-master.zipCode/ $ unzip qrcode-master.zip

下面我们将一起来读下MyQR的源码内容,并且针对重点部分给大家详细讲解。

1.MyQR文件结构

qrcode│   LICENSE.md  │   README.md    │   requirements.txt    #环境依赖文件|   myqr.py|└───MyQR│   │   __init__.py│   │   myqr.py     #调用的文件│   │   terminal.py #设置参数|   |│   └───mylibs│       │   __init__.pt│       │   constant.py  #数据分析|       |   data.py     #数据编码│       │   ECC.py      #纠错编码,Error Correction Codewords |       |   structure.py    #数据结构|       |   matrix.py       #获得QR矩阵|       |   draw.py         #生成二维码|       |   theqrmodule.py  #结合函数│   └───example    │   0.png    │   1.png    |   2.png    |   ...

大家可以执行如下命令查看整个文件的目录树:

tree qrcode-master

2.生成二维码的步骤

2.1 数据分析MyQR/mylibs/constant.py

确定编码的字符类型,按相应的字符集转换成符号字符。

2.2 数据编码MyQR/mylibs/data.py

将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。

2.3 纠错编码MyQR/mylibs/ECC.py

按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列。

2.4 构造最终数据信息MyQR/mylibs/structure.py + matrix.py

在规格确定的条件下,将上面产生的序列按次序放入分块中,将数据转成能够画出二维码的矩阵。

创建二维码的矩阵

# MyQR/mylibs/matrix.pydef get_qrmatrix(ver, ecl, bits):    num = (ver - 1) * 4 + 21    qrmatrix = [[None] * num for i in range(num)]    # 添加查找器模式和添加分隔符    add_finder_and_separator(qrmatrix)# 添加校准模式    add_alignment(ver, qrmatrix)# 添加时间模式    add_timing(qrmatrix)        # 添加涂黑模块和保留区域    add_dark_and_reserving(ver, qrmatrix)        maskmatrix = [i[:] for i in qrmatrix]        # 放置数据位    place_bits(bits, qrmatrix)        # 蒙版操作    mask_num, qrmatrix = mask(maskmatrix, qrmatrix)        # 格式信息    add_format_and_version_string(ver, ecl, mask_num, qrmatrix)return qrmatrix

2.5 生成二维码MyQR/mylibs/draw.py

使用 draw.py 画出二维码。

def draw_qrcode(abspath, qrmatrix):    unit_len = 3    x = y = 4*unit_len    pic = Image.new('1', [(len(qrmatrix)+8)*unit_len]*2, 'white')   #新建一张白色的底图        '''    循环矩阵中的单位,在需要涂黑的单位启用dra_a_black_unit()函数涂黑。    '''    for line in qrmatrix:        for module in line:            if module:                draw_a_black_unit(pic, x, y, unit_len)  #画出黑单位            x += unit_len        x, y = 4*unit_len, y+unit_lensaving = os.path.join(abspath, 'qrcode.png')    pic.save(saving)    # 保存二维码图片    return saving

3.合并图片的原理

让我们来看一下 /MyQR/myqr.py 中的 combine() 方法,此方法调用了 Pillow

读取图片操作

    qr = Image.open(qr_name)    #读取二维码图片    qr = qr.convert('RGBA') if colorized else qr    #判断二维码是否有色            bg0 = Image.open(bg_name).convert('RGBA')   #读取要合并的图片    bg0 = ImageEnhance.Contrast(bg0).enhance(contrast)  # 调节对比度    bg0 = ImageEnhance.Brightness(bg0).enhance(brightness)  # 调节亮度

将新加的图片覆盖原有的二维码图片,生成新的图片并保存。

   for i in range(qr.size[0]-24):        for j in range(qr.size[1]-24):            if not ((i in (18,19,20)) or (j in (18,19,20)) or (i<24 and j<24) or (i<24 and j>qr.size[1]-49) or (i>qr.size[0]-49 and j<24) or ((i,j) in aligs) or (i%3==1 and j%3==1) or (bg0.getpixel((i,j))[3]==0)):                qr.putpixel((i+12,j+12), bg.getpixel((i,j)))

源码简单的解读就是这些,如果想更深入的了解,请在阅读原文处亲自阅读源码。


实验总结

二维码的内容,就到此结束了。二维码在日常生活中的使用场景很多,大家可以结合实际生活来使用。

本实验主要的知识点如下:

  • 调用MyQR库

  • 了解MyQR库的具体实现原理


点击「阅读原文」了解更多Python生成二维码相关内容!

关注我们!收获更多编程好课!

我的二维码上有新垣结衣老婆哦:)相关推荐

  1. 常见二维码上那些奇怪的图案是什么

    专题:神奇二维码  改变生活方式的黑白方块 常见的二维码上为啥三个角上有方块 这是三个定位点,图形旋转也不影响识别 要了解二维码的原理,我们先要来好好认识一下它.现在最常见的二维码是QR二维码(QR是 ...

  2. java+vue的二维码生成,二维码上传服务器,二维码的压缩包下载

    一. vue页面生成二维码 <template><div class="app-container">//在页面放着二维码的div<div id=&q ...

  3. 用 java 读取获取 二维码上的文字内容

    最近公司做一个物联网的项目,由于设备硬件编码复杂,因此业务人员提出能否使用手机扫一扫识别设备上二维码获取二维码上的编号,进而录入设备信息,在手机app上操作.因此写了如下的程序,希望对大家有帮助. 1 ...

  4. 求救pythonlogo嵌入到二维码里面,为什么这个代码运行了却没有logo嵌入到二维码上

    import qrcode from PIL import Image import os# 生成带logo的二维码图片 def get_qr(str, logo, save):# 参数配置qr = ...

  5. 在二维码上添加图片主题(支持链接跳转)

    (1) MatrixToImageWriter二维码创建核心类 package com.yx.yzh.utils; import java.awt.Color; import java.awt.Fon ...

  6. 通过二维码上传手机文件到服务器

    Hello,大家好.这是我的第一篇博客,给大家分享下手机扫码上传图片到服务器实现手机pc同步. 1.自动生成二维码--> 可以去二维码生成工具网站获取api也可以直接用这个:http://qr. ...

  7. 二维码上传失败如何处理?怎么解决无法解析的二维码?

    有些小伙伴可能会遇到过想要对二维码美化处理,但是上传二维码之后出现解析失败的提示,那么遇到这个问题该如何处理呢?今天小编给大家分享一下二维码生成器处理这个问题的方法,而且还可以同步对二维码图片做美化处 ...

  8. 微信支付二维码上添加logo

    工具类的使用,分享给大家.先看效果: 无logo时: 有logo时: import java.awt.image.BufferedImage; import java.io.File; import ...

  9. 【小程序开发原创】小程序裁剪图片上传头像,二维码源码

    微信小程序 图片裁剪工具,简单易用 项目需求 在做微信小程序的时候有个图片上传之前裁剪的需求,找过一些github中的项目,都不太理想,主要是没有办法自定义宽高,于是自己研究了一下,做了一个简单的图片 ...

最新文章

  1. 广西互联网金融平台系列-7条奇怪的投资数据
  2. mac下 VisualBox 虚拟机转移到活动硬盘,出现 UUID 错误
  3. tkinter笔记:scale 尺度 (莫烦python笔记)
  4. 电影编码JPEG2000与H.264
  5. c#中将WM_CLOSE消息发送到没有窗口的进程的方法
  6. asp.net发布网站的详细步骤
  7. 【转】x.509证书在WCF中的应用(CS篇)
  8. Java中的enum详细解析------Java 语言中 Enum 类型的使用介绍
  9. 低通滤波器转带通滤波器公式由来_什么是-3dB截止频率?浅析滤波器原理、分类和滤波器优化!...
  10. Jetpack Compose - CircularProgressIndicator、LinearProgressIndicator
  11. centos查询mysql端口被占用_centos查看端口占用情况
  12. jetson tx2平台调试EC20 4G模块
  13. 解决安装宝塔面板“ERROR: Failed to download, please try install again”错误
  14. 第 2-3 课:迭代法计算定积分
  15. 第15章 实时时钟DS1302
  16. 多对多业务,数据库水平切分架构一次搞定(58沈剑)
  17. Win8系统鼠标右键突然失灵怎么办 win8桌面右键菜单失效怎么修复
  18. 后台页面-制作铃铛带数字消息提示样式
  19. 运营商大数据获客的优势
  20. SQL安装提示配置服务器失败解决办法

热门文章

  1. 质点动力学与机械能守恒
  2. 蓝桥学习 PREV-50
  3. 聚焦技术与体验极致提升,阿里云视频云连续5年领跑!
  4. 芯禾科技电磁仿真软件IRIS
  5. c语言n次方怎么输入_C语言中10个经典的算法,学会它,利用它
  6. 20211013学习总结
  7. 3位格雷码的顺序编码_一种优化格雷码编码方式实现跨时钟域的装置的制作方法...
  8. 小书匠绑定阿里云oss+阿里云oss图片url永久有效设置--菜鸟小回
  9. 关于深度学习模型泛化问题的一些思考
  10. Excel中OFFSET函数(一)——“实现矩阵转置”