python生成个性二维码学习笔记
在linux环境下进行编码
1、先进家目录,自行创建Code文件夹
cd Code
2、下载MyQR库
sudo pip3 install MyQR
3、下载所需资源文件并解压
Code/ $ wget http://labfile.oss.aliyuncs.com/courses/1126/Sources.zip #这里提供制作二维码所需要的图片资源
Code/ $ unzip Sources.zip
4、
由于虚拟环境缺少了一些FreeImage依赖。我们在这里手动添加。
在root根目录里打开终端:
jack/ $ mkdir .imageio && cd .imageio
.imageio/ $ mkdir freeimage && cd freeimage
freeimage/ $ wget http://labfile.oss.aliyuncs.com/courses/1126/libfreeimage-3.16.0-linux64.so
5、
确保当前目录为Code
,在命令行中输入 python3 ,进入 python3 环境:
Code/ $ python3
在 python3 环境中输入以下代码:
>>>from MyQR import myqr
>>>myqr.run('https://www.cnblogs.com/jackzz/')
大功告成,那么来看一看自己制作的第一张二维码图片吧!
先退出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,默认存储位置是当前目录 |
6、动态图二维码
>>>myqr.run(
... words='https://www.baidu.com',
... picture='Sources/gakki.gif',
... colorized=True,
... save_name='Animated.gif',
...)
用浏览器打开图片扫码看看是不是跳转到百度去了
MyQR源码来自于github上的sylnsfar/qrcode项目,大家可以通过克隆的方式下载源码来学习,可以使用如下命令行:
Code/ $ git clone https://github.com/sylnsfar/qrcode.git
如果下载速度较慢的话,也可以下载我们服务器上面的源码,可以通过如下命令:
Code/ $ wget http://labfile.oss.aliyuncs.com/courses/1126/qrcode-master.zip
Code/ $ 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
│ │ constan.py #数据分析
| | data.py #数据编码
│ │ ECC.py #纠错编码,Error Correction Codewords
| | structure.py #数据结构
| | matrix.py #获得QR矩阵
| | draw.py #生成二维码
| | theqrmodule.py #结合函数
│
└───example
│ 0.png
│ 1.png
| 2.png
| ...
2.生成二维码的步骤
2.1 数据分析MyQR/mylibs/constan.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.py
def 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_len
saving = 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)))
源码简单的解读就是这些
python生成个性二维码学习笔记的更多相关文章
- Python 生成个性二维码
1.1 实验内容 本课程通过调用MyQR接口来实现生成个人所需二维码,并可以设置二维码的大小.是否在现有图片的基础上生成.是否生成动态二维码. 本课程主要面向Python3初学者. 1.2 知识点 P ...
- 你只要5行代码,拥有你的个性二维码,用Python生成动态二维码
如果想了解更多关于python的应用,可以私信我,或者点击下方链接自行获取,里面到资料都是免费的(http://t.cn/A6Zvjdun) 二维码满天飞,但是有没有想过Python也能制作出专属于自 ...
- java生成二维码学习笔记
纠错等级: QRErrorCorrectLevel.L 7%的字码可被修正 QRErrorCorrectLevel.M 15%的字码可被修正 QRErrorCorrectLevel.Q 25%的字码可 ...
- python生成动态个性二维码
1 安装工具2 生成普通二维码3 带图片的二维码4 动态 GIF 二维码5 在Python程序中使用 一.安装 首先在python环境下运行, 打开cmd进入python27 进入scripts 然后 ...
- Python用MyQR生成自定义个性二维码
MyQR是一个能够生成自定义二维码的python第三方库,根据需要能够生成普通二维码.带背景图片的艺术二维码.动态二维码. 1.MyQR安装 安装非常简单,直接用pip install MyQR,需要 ...
- python小工具myqr生成动态二维码
python小工具myqr生成动态二维码 (一)安装 (二)使用 (一)安装 命令: pip install myqr 安装完成后,就可以在命令行中输入 myqr 查看下使用帮助: myqr --he ...
- Python | 一行命令生成动态二维码
当我看到别人的二维码都做的这么炫酷的时候,我心动了! 我也想要一个能够吸引眼球的二维码,今天就带大家一起用 Python 来做一个炫酷的二维码! 首先要安装工具 myqr: pip install m ...
- AJ学IOS 之二维码学习,快速生成二维码
AJ分享,必须精品 二维码是一项项目中可能会用到的,iOS打开相机索取二维码的速度可不是Android能比的...(Android扫描二维码要来回来回晃...) 简单不多说,如何把一段资料(网址呀,字 ...
- Python制作动态二维码只需要一行代码!炒鸡简单!
分享一个比较有意思的项目,只需要一行Python代码就可以快捷方便生成普通二维码.艺术二维码(黑白/彩色)和动态GIF二维码. 用法比较简单,直接通过pip安装即可. pip3 install myq ...
随机推荐
- 【算法】LeetCode算法题-Reverse Integer
这是悦乐书的第143次更新,第145篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第2题(顺位题号是7),给定32位有符号整数,然后将其反转输出.例如: 输入: 123 ...
- 一张有料的图片!!!附文件-图片合成器C语言实现算法
凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.打开F盘,先找两个文件,一个是压缩文件(2.rar),另一个是一张图片(1.jpg),将其放到F盘目录下, ...
- JavaScript原型链和继承
1.概念 JavaScript并不提供一个class的实现,在ES6中提供class关键字,但是这个只是一个语法糖,JavaScript仍然是基于原型的.JavaScript只有一种结构:对象.每个对 ...
- es6拼接字符串``
不需要任何的加号和引号,全部字符仅仅由一组``符号包裹即可,而放置动态数据或者变量即用${变量}方式即可, 看着是真的一目了然啊,最主要是终于可以摆脱被拼接字符支配的恐惧了,哈哈哈哈.
- 如何用Ant Design Pro框架做项目省力
1.熟悉React所有语法,以及redux.redux-saga.dva.一类的库的能力 2.灵活运用该框架提供的基础UI组件,想方设法利用现有的UI组件进行组合,尽可能减少工作量
- DefaultNamespaceHandlerResolver中handlerMappings如何初始化
前言:最近一直在看Spring源码,今天在调试的时候发现一个小问题:在注册bean时,需要初始化spring默认命名空间处理器,具体在DefaultNamespaceHandlerResolver中实 ...
- ElasticSearch(四):使用Java连接ElasticSearch集群
public class ESIndexMapping { private static String host="192.168.56.3"; // 服务器地址 private ...
- UVA129-Krypton Factor(搜索剪枝)
Problem UVA129-Krypton Factor Accept:1959 Submit:10261 Time Limit: 3000 mSec Problem Description 通 ...
- 邮票面值设计 (动态规划+DFS)
题意:https://ac.nowcoder.com/acm/problem/16813 思路: 深度搜索:每一层枚举一个面值,然后通过dp进行检查,并通过已知面值得到最多n张得到的最大表示数. 其实 ...
- 简单使用普通用户启动tomcat
新建用户tomcat,该用户不能登录 useradd tomcat -s '/sbin/nologin' 将/usr/local/tomcat/bin/startup.sh更名 mv /usr/loc ...