[Python模块学习]用qrcode模块生成二维码
来源:互联网 发布:js控制div滚动条位置 编辑:程序博客网 时间:2024/05/18 00:06
qrcode模块
by: GanZiQim
功能描述:qrcode模块是Github上的一个开源项目,提供了生成二维码的接口。qrcode默认使用PIL库用于生成图像。
函数形式生成二维码
qrcode.make(data)
make函数返回一个qrcode.image.pil.PilImage对象。该对象不像PIL.Image.Image一样可以直接调用show函数直接显示,但可以通过调用get_image函数返回一个PIL.Image.Image对象,再在Image对象上面进行操作。也可以直接调用save函数将二维码保存到本地。
import qrcodeimg = qrcode.make("hello world!")img.get_image().show()img.save('hello.png')
类实例形式生成二维码
QRCode(version=None, error_correction=constants.ERROR_CORRECT_M, box_size=10, border=4, image_factory=None)
QRCode是qrcode模块的一个内置类。QRCode的实例使用QRCode.add_data(data)函数添加数据。使用QRCode.make(fit=True)函数生成图片。使用QRCode.make_image(image_factory=None)函数得到Image对象。
version参数为一个取值范围1-40的整数(或字符串),用于控制二维码的尺寸。最小的尺寸1是一个21格*21格的矩阵。该值设置为None(默认),并且调用make函数时fit参数为True(默认)时,模块会自己决定生成二维码的尺寸。
error_correction参数用于控制二维码的错误纠正程度。可以取以下四个保存在模块中的常量:
- ERROR_CORRECT_L:大约7%或者更少的错误会被更正。
- ERROR_CORRECT_M:默认值,大约15%或者更少的错误会被更正。
- ERROR_CORRECT_Q:大约25%或者更少的错误会被更正。
- ERROR_CORRECT_H:大约30%或者更少的错误会被更正。
box_size参数控制二维码中每个格子的像素数,默认为10。
border参数控制边框(二维码四周留白)包含的格子数(默认为4,是标准规定的最小值)。
image_factory参数是一个继承于qrcode.image.base.BaseImage的类,用于控制make_image函数返回的图像实例。image_factory参数可以选择的类保存在模块根目录的image文件夹下。image文件夹里面有五个.py文件,其中一个为__init__.py,一个为base.py。还有pil.py提供了默认的qrcode.image.pil.PilImage类。pure.py提供了qrcode.image.pure.PymagingImage类。svg.py提供了SvgFragmentImage、SvgImage和SvgPathImage三个类。
注:实际上make函数也是通过实例化一个QRCode对象来生成二维码的。调用make的时候也可以传入初始化参数。
QRCode.make_image函数可以通过改变fill_color和back_color参数改变生成图片的背景颜色和格子颜色。
import qrcodeqr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4,)qr.add_data('Some data')qr.make(fit=True)img = qr.make_image(fill_color="black", back_color="white")img.save('qrcode.png')
生成SVG格式的二维码
qrcode可以生成三种不同的svg图像,一种是用路径表示的svg,一种是用矩形集合表示的完整svg文件,还有一种是用矩形集合表示的svg片段。第一种用路径表示的svg其实就是矢量图,可以在图像放大的时候保持图片质量,而另外两种可能会在格子之间出现空隙。具体请用搜素引擎搜“矢量图与位图的区别。
这三种分别对应了svg.py中的SvgPathImage、SvgImage和SvgFragmentImage类。在调用qrcode.make函数或者实例化QRCode时当作参数传入就可以了。
另外还有qrcode.image.svg.SvgFillImage和qrcode.img.svg.SvgPathFillImage。分别继承自SvgImage和SvgPathImage。这两个并没有其他改变,只不过是默认把背景颜色设置为白色而已。
import qrcodeimport qrcode.image.svgif method == 'basic': # Simple factory, just a set of rects. factory = qrcode.image.svg.SvgImageelif method == 'fragment': # Fragment factory (also just a set of rects) factory = qrcode.image.svg.SvgFragmentImageelse: # Combined path factory, fixes white space that may occur when zooming factory = qrcode.image.svg.SvgPathImageimg = qrcode.make('Some data here', image_factory=factory)
注:Python2.6版本的xml.etree.ElementTree无法用于生成SVG图像,需要安装lxml才可以完成相应功能。
Pure Python PNG
通过pip install git+git://github.com/ojii/pymaging.git#egg=pymaging
和pip install git+git://github.com/ojii/pymaging-png.git#egg=pymaging-png
安装pymaging相关模块之后,就可以通过给image_factory参数传入qrcode.image.pure.PymagingImage来生成PNG图片了。
import qrcodefrom qrcode.image.pure import PymagingImageimg = qrcode.make('Some data here', image_factory=PymagingImage)
命令行模式
qrcode还提供了通过命令行生成二维码的程序。在命令行中使用qr [--factory] [--error-correction]
命令即可。
qr "Some text" > test1.pngqr --factory=svg-path "Some text" > test2.svgqr --factory=svg "Some text" > test3.svgqr --factory=svg-fragment "Some text" > test4.svgqr --factory=pymaging "Some text" > test5.png
在二维码中放入LOGO
思凡念真的博客上还介绍了一种给二维码加上logo的方法,这里我将代码摘下来并加上注释,供读者参考。
from PIL import Imageimport qrcode# 初步生成二维码图像qr = qrcode.QRCode(version=5,error_correction=qrcode.constants.ERROR_CORRECT_H,box_size=8,border=4)qr.add_data("http://www.cnblogs.com/sfnz/")qr.make(fit=True)# 获得Image实例并把颜色模式转换为RGBAimg = qr.make_image()img = img.convert("RGBA")# 打开logo文件icon = Image.open("D:/favicon.jpg")# 计算logo的尺寸img_w,img_h = img.sizefactor = 4size_w = int(img_w / factor)size_h = int(img_h / factor)# 比较并重新设置logo文件的尺寸icon_w,icon_h = icon.sizeif icon_w >size_w: icon_w = size_wif icon_h > size_h: icon_h = size_hicon = icon.resize((icon_w,icon_h),Image.ANTIALIAS)# 计算logo的位置,并复制到二维码图像中w = int((img_w - icon_w)/2)h = int((img_h - icon_h)/2)icon = icon.convert("RGBA")img.paste(icon,(w,h),icon)# 保存二维码img.save('D:/createlogo.jpg')
总结
qrcode模块提供了生成各种二维码图像的接口,还提供了通过命令行生成二维码的方法,使用起来非常方便。不过模块内部还有很多细节无法一一细讲,还是那句话,希望有能力有精力的读者可以去阅读一下源码。
参考资料:
以上内容主要参考qrcode官方文档及源码
放入logo部分参考思凡念真的博客
感谢以上的内容提供者!
- [Python模块学习]用qrcode模块生成二维码
- Python使用QRCode模块生成二维码
- Python使用QRCode模块生成二维码
- Python使用QRCode模块生成二维码
- Python使用QRCode模块生成二维码
- Python使用QRCode模块生成二维码
- Python使用QRCode模块生成二维码
- Python使用QRCode模块生成二维码
- Python下使用qrcode模块生成vCard电子名片二维码图片
- python 生成qrcode二维码
- python qrcode 生成二维码
- 用QRCode生成二维码
- python qrcode生成彩色二维码
- Python使用QRCode生成二维码
- python生成二维码包qrcode
- Java-QRCode生成二维码学习
- Python 的生成二维码生成库 -- qrcode
- 用QRCode方法生成二维码
- DropMenuWidget(下拉二级菜单)
- Leetcode 455. Assign Cookies
- Android(安卓)产生0-9不重复随机数组高效方法。
- div居中显示
- 纯CSS画三角形,深度解析原理/思维扩展
- [Python模块学习]用qrcode模块生成二维码
- Activity中的数据传送—案例: 购买装备
- VMware 虚拟机linux联网
- 终身机器学习(Lifelong Machine Learning)综述
- 递推递归练习E
- 【实验三】多媒体文件的读写和转换
- Codeforces Beta Round #4 (Div. 2 Only) D. Mysterious Present 记忆化搜索
- 利用LaTeX展现C++代码
- 20170325#cs231n#10.Understanding and Visualizing Convolutional Neural Networks