PyQt5实战之二维码生成器(三):定制化二维码

前言

经过上一章,我们实现界面中各个控件的功能,本章将说明二维码的生成及样式修改。

千呼万唤始出来(虽然并没有呼唤,但总要想个开头),终于到了核心功能的生成二维码部分。万能的Python生态中自然不乏生成二维码的库,笔者采用的是以下两个库,分别用于生成 logo 和背景图模式的二维码。

import qrcode
from MyQR import myqr

一、自定义前景色和Logo

输入的参数为:数据、尺寸(默认为5,暂未增加用户修改的功能)、图像路径(默认无图像,可以修改前景色)、颜色代码(默认黑色)。

def QR_qrcode(data, size=5, imagepath=None, color='#000000'):
    try:
        qr = qrcode.QRCode(
            version = 4, # 精度,默认6
            error_correction = qrcode.constants.ERROR_CORRECT_H,
            box_size = size, # 尺寸,默认5
            border = 3 )
        qr.add_data(data)
        qr.make(fit=True)

        img = qr.make_image(fill_color = color)
        img = img.convert('RGBA') # 设为彩色

        if imagepath != None: # 如果打开了图片
            logo = Image.open(imagepath)  # 二维码中心的图片
            img_w, img_h = img.size     # 二维码尺寸由box_size参数设定
            # logo_w, logo_h = logo.size  # logo图片尺寸
            logo_w = int(img_w/4)
            logo_h = int(img_h/4)
            logo = logo.resize((logo_w, logo_h), Image.ANTIALIAS)
            w = int((img_w - logo_w) / 2) # logo在二维码中的位置
            h = int((img_h - logo_h) / 2)
            logo = logo.convert('RGBA')
            img.paste(logo, (w, h), logo)

        img.save('test_qr.png')
    except:
        pass

二、自定义背景图

输入的参数为:数据、图像路径、文件名(根据用户选择静态图和动态图而有所不同)、尺寸(精度)、透明度(通过对比度和亮度两个参数共同实现透明度的调节)。

def QR_myqr(data, imagepath, filename, size=8, contrast=1.0): 
    try:
        print("------\nbackground-image path:",imagepath)
        myqr.run(
            words = data,
            version = size, # 大小1~40,默认8
            level='H', # 纠错级别
            picture = imagepath, # 底图
            colorized = True, # 彩色
            contrast = contrast, # 对比度
            brightness = 1.0 + (1-contrast), # 亮度
            save_name = filename,
            save_dir = os.getcwd() #当前目录
        )
        print('get version_back')
    except:
        print('warning: background error')

三、在 getQR() 中使用

还记得在数据输入章节中的 getQR() 方法吗?接下来需要将生成二维码的方法按需求整合进去。

def getQR(self): # 生成二维码
    data_flag = self.toolBox.currentIndex() # 数据类型(所选栏目)
    data = ''
    . . . . . .
    # 执行生成二维码 ------
    try:
        pass
    except:
        pass

来看一下在 try 中需要写入的代码,首先是带图片的 logo 模式,调用 QR_qrcode() 方法传入数据、图像路径和颜色代码。

if self.radioButton_0.isChecked() and imagepath != '':  # 选择logo且打开了图片
    QR_qrcode(data, imagepath=imagepath, color=color)

在这里插入图片描述
然后是带图片的背景图模式,调用 QR_myqr() 方法传入数据、图像路径、文件名。如果用户选择动态图作为底图,需缩小图像尺寸,且不可修改透明度,并弹出提示告知用户需在根目录查看生成的动态二维码;如果用户选择静态图,则可以修改透明度。

elif self.radioButton_1.isChecked() and imagepath != '':  # 选择background且打开了图片
    if filetype == ".gif":
        QMessageBox.about(self,self.tr("Remind"),self.tr("Detected as GIF image, please wait...\n(*Note: transparency cannot be modified)"))
        QR_myqr(data, path,'test_qr.gif',size = 3)  # gif底图缩小尺寸,限制透明度不变
        QMessageBox.about(self, self.tr("Remind"), self.tr("Please check the generated GIF in the root directory !"))
    else:
        QR_myqr(data, path, 'test_qr.png', contrast =depth)

在这里插入图片描述
接着是无图像二维码,调用 QR_qrcode() 方法传入数据和颜色代码即可。

elif imagepath == '':  # 无图
    QR_qrcode(data, color=color)

最后读入生成的图像,将其在 label 中显示出来即可。至此,便已实现自定义二维码生成器的基本功能。

file = 'test_qr.png' if filetype != ".gif" else 'test_qr.gif'
img = QPixmap(file).scaled(self.label_result.width(), self.label_result.height())  # 裁剪图片
self.label_result.setPixmap(img)  # 加载图片

在这里插入图片描述

四、本章小结

第三章我们利用 qrcode 和 MyQR 库实现了定制化二维码的生成,可以修改二维码的颜色、logo、背景图等。关于二维码的定制化还有更多方式,有机会可以再进行探究。下一章将继续讲解界面的国际化、管理打包资源两个部分的内容,敬请关注!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值