• [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
  • 相关阅读:
    解决ActiveX插件ZIndex属性无效问题
    XNA游戏开发之字符篇
    XNA游戏开发之滚动背景
    ExtJs之FormPanel篇
    独立Discuz头像编辑模块
    XNA游戏开发之2D游戏
    WPF系列之应用程序生命周期
    DiscuzX2.0在windows下的配置
    Silverlight之out of Browser模式
    使用VisualStudio2010连接CodePlex进行代码管理
  • 原文地址:https://www.cnblogs.com/syh6324/p/9497135.html
Copyright © 2020-2023  润新知