源码先锋

源码先锋

实验分享:用Python 生成个性二维码

admin 117 22

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

实验内容:

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

知识点

Python3基础

MyQR库

可以实现:

普通二维码

动态二维码

所需实验环境

一、实验准备

创建环境

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

$cdCode
下载MyQR
$sudopip3installMyQR
下载所需资源文件并解压
Code/$wget$
FreeImage

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

在shiyanlou根目录里打开终端:

shiyanlou/$/$mkdirfreeimagecdfreeimagefreeimage/$wget

二、实验步骤

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

普通二维码

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

Code/$python3

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

('')

大功告成,那么来看一看自己制作的第一张二维码图片吧!(珍惜账号在这里我就不放图片啦~)

先退出python3环境

quit()

再使用火狐浏览器预览

Code/$

快快拿起手机扫一扫,看看是否有效,若成功,将跳转到蓝桥云课主页。

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

参数

含义

详细

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,默认输出文件名是""

save_dir

存储位置

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

图片二维码

光是二维码,是否太单调了呢?没关系,我们能加上我们想要的图片,使二维码更具辨识度!我们准备了蓝桥云课的Logo,也可以选择你个人喜爱的一张来制作艺术二维码!

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

(words='',picture='Sources/',save_name='',)

再次退出python3环境

quit()

使用火狐浏览器打开图片

Code/$

就会得到一张黑白的蓝桥云课Logo二维码。

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

(words='',picture='Sources/',colorized=True,save_name='artistic_',)
Code/$firefoxartistic_

这样我们就会得到一张彩色的蓝桥云课Logo二维码。

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

动态二维码

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

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

(words='',picture='Sources/',colorized=True,save_name='',)

这样就可以得到新垣结衣动态二维码啦!

三、MyQR源码解读

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

Code/$gitclone

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

Code/$wget$

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

1.MyQR文件结构
qrcode│││调用的文件││数据分析||纠错编码,ErrorCorrectionCodewords||获得QR矩阵||结合函数│└───example│0.png│1.png|2.png|

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

treeqrcode-master
2.生成二维码的步骤

2.1数据分析MyQR/mylibs/

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

2.2数据编码MyQR/mylibs/

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

2.3纠错编码MyQR/mylibs/

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

2.4构造最终数据信息MyQR/mylibs/+

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

创建二维码的矩阵

添加查找器模式和添加分隔符add_finder_and_separator(qrmatrix)添加时间模式add_timing(qrmatrix)放置数据位place_bits(bits,qrmatrix)格式信息add_format_and_version_string(ver,ecl,mask_num,qrmatrix)returnqrmatrix

2.5生成二维码MyQR/mylibs/

使用画出二维码。

defdraw_qrcode(abspath,qrmatrix):unit_len=3x=y=4*unit_lenpic=('1',[(len(qrmatrix)+8)*unit_len]*2,'white')画出黑单位x+=unit_lenx,y=4*unit_len,y+unit_lensaving=(abspath,'')(saving)读取二维码图片qr=('RGBA')ifcolorizedelseqr读取要合并的图片bg0=(bg0).enhance(contrast)调节亮度

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

foriinrange([0]-24):forjinrange([1]-24):ifnot((iin(18,19,20))or(jin(18,19,20))or(i24andj24)or([1]-49)or([0]-49andj24)or((i,j)inaligs)or(i%3==1andj%3==1)or(((i,j))[3]==0)):((i+12,j+12),((i,j)))
实验总结

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