[Python]使用QRCode生成彩色二维码

一、 安装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_colorback_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"为图片文件名
四、更多QRCode操作说明请参考网页:https://github.com/lincolnloop/python-qrcode
posted @ 2018-08-18 15:10  乐松  阅读(1924)  评论(0编辑  收藏  举报