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 ...
随机推荐
- Linux 小知识翻译 - 「cron」
这次说说「cron」. 「cron」就是「定期自动执行任务的工具」(相当于windows中的计划任务).读做「库隆」.使用「cron」,可以预先指定任务在某个时间执行. 时间的指定并不只是「一小时一次 ...
- Ubuntu 12.04上安装HBase并运行
Ubuntu 12.04上安装HBase并运行 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.HBase的安装 在官网上下载HBase-1.1.2 ...
- Java虚拟机(Java Virtual Machine)
JVM(Java Virtual Machine),Java虚机机,是JDK最底层的东西.只要能将源代码编译成字节码(.class)文件,就可以由JVM在不同平台上解释成机器指令来执行.所以,Java ...
- Java访问级别修饰符
用途 控制其他类可以访问的字段或方法 修饰符 public.protected.no modifier(未声明).private 访问级别 修饰符 当前类 包 子类 其他包 public √ √ √ ...
- Maven将中央仓库修改为阿里云的仓库地址
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexu ...
- ORCFILE IN HDP 2: BETTER COMPRESSION, BETTER PERFORMANCE
ORCFILE IN HDP 2: BETTER COMPRESSION, BETTER PERFORMANCE by Carter Shanklin The upcoming Hive 0.12 ...
- SpringBoot2.0 最简单的 idea 快速创建项目
第一步 第二步 第三步 以上就是idea快速创建springboot的方法,创建之后等maven 依赖下载完成,就可以使用
- SQlite源码分析--源网站
http://huili.github.io/B-treeImplementation/hierarchicalorganization.html SQLite中的B-tree SQLite中每个数据 ...
- 转://Oracle中User和Schema的区别和联系
今天在阅读Oracle官方文档的时候,读到schema的基本概念,这就让我产生了一个疑问:user和schema两者之间到底有什么区别?为了更深层次的理解二者之间的区别和联系,以下是官方文档中关于us ...
- 02 python初学 (数字运算 逻辑运算)
运算: 5/2 -> 2.5 5//2 -> 2 取整 5%2 -> 1 取余 2**10 -> 1024 指数运算 逻辑运算符: and : 条件1 and 条件2 no ...