[Python模块学习]用qrcode模块生成二维码

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 qrcode
img = 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对象。

  1. version参数为一个取值范围1-40的整数(或字符串),用于控制二维码的尺寸。最小的尺寸1是一个21格*21格的矩阵。该值设置为None(默认),并且调用make函数时fit参数为True(默认)时,模块会自己决定生成二维码的尺寸。

  2. error_correction参数用于控制二维码的错误纠正程度。可以取以下四个保存在模块中的常量:

    • ERROR_CORRECT_L:大约7%或者更少的错误会被更正。
    • ERROR_CORRECT_M:默认值,大约15%或者更少的错误会被更正。
    • ERROR_CORRECT_Q:大约25%或者更少的错误会被更正。
    • ERROR_CORRECT_H:大约30%或者更少的错误会被更正。
  3. box_size参数控制二维码中每个格子的像素数,默认为10。

  4. border参数控制边框(二维码四周留白)包含的格子数(默认为4,是标准规定的最小值)。

  5. 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 qrcode
qr = 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 qrcode
import qrcode.image.svg

if method == 'basic':
    # Simple factory, just a set of rects.
    factory = qrcode.image.svg.SvgImage
elif method == 'fragment':
    # Fragment factory (also just a set of rects)
    factory = qrcode.image.svg.SvgFragmentImage
else:
    # Combined path factory, fixes white space that may occur when zooming
    factory = qrcode.image.svg.SvgPathImage

img = 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=pymagingpip install git+git://github.com/ojii/pymaging-png.git#egg=pymaging-png安装pymaging相关模块之后,就可以通过给image_factory参数传入qrcode.image.pure.PymagingImage来生成PNG图片了。

import qrcode
from qrcode.image.pure import PymagingImage
img = qrcode.make('Some data here', image_factory=PymagingImage)

命令行模式

qrcode还提供了通过命令行生成二维码的程序。在命令行中使用qr [--factory] [--error-correction]命令即可。

qr "Some text" > test1.png

qr --factory=svg-path "Some text" > test2.svg
qr --factory=svg "Some text" > test3.svg
qr --factory=svg-fragment "Some text" > test4.svg

qr --factory=pymaging "Some text" > test5.png

思凡念真的博客上还介绍了一种给二维码加上logo的方法,这里我将代码摘下来并加上注释,供读者参考。

from PIL import Image
import 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实例并把颜色模式转换为RGBA
img = qr.make_image()
img = img.convert("RGBA")

# 打开logo文件
icon = Image.open("D:/favicon.jpg")

# 计算logo的尺寸
img_w,img_h = img.size
factor = 4
size_w = int(img_w / factor)
size_h = int(img_h / factor)

# 比较并重新设置logo文件的尺寸
icon_w,icon_h = icon.size
if icon_w >size_w:
    icon_w = size_w
if icon_h > size_h:
    icon_h = size_h
icon = 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部分参考思凡念真的博客

感谢以上的内容提供者!

猜你喜欢

转载自blog.csdn.net/jy692405180/article/details/65937077