一、 安装QRCode模块
-
QRCode模块依赖于Pillow模块,在安装QRCode模块前需要先安装Pillow模块。可使用如下命令安装:
pip install Pillow
-
QRCode模块安装命令如下:
pip install qrcode
二、使用QRCode生成二维码
- 使用
make
函数生成二维码,这种方法比较简单。举例如下:
import qrcode
img = qrcode.make("Some data here") #生成二维码,"Some data here"为二维码中的信息
img.save("qrtest.jpg") #保存二维码,"qrtest.jpg"为图片文件名
- 如果需要更多控制,使用
QRCode
类生成二维码。举例如下:
import qrcode
from PIL import Image, ImageDraw
from qrcode.image.pil import PilImage
#自定义图像生成器(定义此类是为了实现彩色二维码)
class MyPilImage(PilImage):
"""
自定义图像生成器
"""
fillcolor = "black"
backcolor = "white"
def new_image(self, **kwargs):
self.fillcolor = kwargs.get('fill_color', 'black')
self.backcolor = kwargs.get('back_color', 'white')
img = Image.new("RGB", (self.pixel_size, self.pixel_size), self.backcolor)
self._idr = ImageDraw.Draw(img)
return img
def drawrect(self, row, col):
box = self.pixel_box(row, col)
self._idr.rectangle(box, fill=self.fillcolor)
#创建QRCode对象
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
#添加信息,生成二维码
qr.add_data('12345678')
qr.make(fit=True)
#生成二维码图像。此处可以省略第一个参数,省略后只能生成黑白二维码
img = qr.make_image(MyPilImage, fill_color="red", back_color="yellow")
#保存图像
img.save("qrtest.png") #保存二维码,"qrtest.png"为图片文件名
参数说明:
-
version
参数是一个1到40的整数,决定二维码的大小(version为1最小,为21x21的矩阵,version每增加1,矩阵就增加4,比如version为2时对应25x25的矩阵,为3时对应29x29的矩阵,依次类推); -
error_correction
表示纠错能力,参数为4个常数,对应4个级别:ERROR_CORRECT_L:%7或更少的错误可以被纠正; ERROR_CORRECT_M:%15或更少的错误可以被纠正,此为默认值; ERROR_CORRECT_Q:%25或更少的错误可以被纠正; ERROR_CORRECT_H:30%或更少的错误可以被纠正。
对于同样大小的二维码,纠错能力越强,存储的信息就越少。
-
box_size
参数决定了二维码色块的大小,即二维码矩阵的每一个点对应的色块大小(以像素为单位)。 -
border
参数决定了二维码边框的宽度,即外围空白的宽度。该参数的值表示box_size的倍数,例如,当box_size为10,border为1时,外围空白宽度为10;box_size为10,border为2时,外围空白宽度为20。version、box_size、border共同决定了二维码图片的像素数。比如,当version为1、box_size为10,border为2时,矩阵为21x21;二维码内部宽度为210(21x10);外围空白宽度为20(2x10),两侧空白共40;二维码边长为250(210+20x2)。计算方法为:(21 + (version - 1) * 4 + border * 2) * box_size。
-
fit
参数设轩是否自动根据信息内容多少调整二维码大小(对应version的值)。当fit为True(默认值)时,自动根据内容调整二维码,此时version可设为None,当version设为某个值时,调整后的二维码不会小于该值对应的版本大小,如果信息量超出了该版本的容量,自动增加尺寸(不会减小);
当fit为False时,不会自动调整二维码大小(此时version不能设为None),如果信息量超出了该版本二维码容量,将会报错。 -
fill_color
和back_color
分别设定的二维码色块颜色和背景颜色,默认为"black"和"white"。颜色必须是web支持的颜色名称,如果颜色不支持,将会报错。前景色一般要深色,背景色为浅色,否则可能无法识别。
三、生成带LOGO的二维码
#导入模块
import qrcode
from PIL import Image
#创建QRCode对象
qr = qrcode.QRCode(
version = 1,
error_correction = qrcode.constants.ERROR_CORRECT_H,
box_size = 10,
border = 1
)
qr.add_data(data_str) #添加信息,data_str为拟创建二维码中的信息字符串
qr.make(fit=True) #生成二维码
img = qr.make_image() #获取二维码图像
img = img.convert("RGBA") #转换图像格式
img_w,img_h = img.size #获取图像宽、高
logo = Image.open(logoptah) #打开logo图像,logopath为logo的文件名和路径
factor = 4 #比例因子,即logo宽度为二维码图像的1/4左右
size_w = int(img_w / factor) #logo宽
size_h = int(img_h / factor) #logo高
logo_w, logo_h = logo.size #获取logo实际宽、高
if logo_w > size_w: #logo宽度小于等于size_w
logo_w = size_w
if logo_h > size_h: #logo高度小于等于size_h
logo_h = size_h
logo = logo.resize((icon_w,icon_h),Image.ANTIALIAS) #缩放logo图片
logo = logo.convert("RGBA") #转换logo格式
w = int((img_w - logo_w)/2) #计算粘贴位置
h = int((img_h - logo_h)/2)
img.paste(logo,(w,h)) #将logo粘贴到二维码图像
img.save("qr.png") #保存二维码,"qr.png"为图片文件名