目录
前言
1、安装第三方库
2、QRCode参数解释
3、自定义二维码生成器
4、给二维码加图片
5、全部代码
6、结果
前言
二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。现在的二维码随处可见,甚至有人觉得在以后的墓碑上都可以刻一个二维码,通过扫描该二维码便可知墓主传奇的一生。所以如何快速定制自己的二维码便显得极为的重要,本文用python生成一个简单的二维码生成器,该生成器可以定制二维码的背景、填充颜色以及二维码中间的背景图片。
1、安装第三方库
win+R,输入cmd,进入系统管理员界面,安装第三方库
pip install qrcodepip install pillow #PIL的派生分支,python3以上PIL的替代库
注: PIL是python重要的图像库,在给二维码加图片时需要用到它,但安装时出现:ERROR: Could not find a version that satisfies the requirement PIL (from versions: none)错误。原来是python3以上该库就用其他的库(pillow)替代了
2、QRCode参数解释
version:值为1~40的整数,控制二维码的大小(最小值是1,是个12×12的矩阵)。如果想让程序自动确定,将值设置为None,并使用fit参数即可。
error_correction:指定二维码的容错系数,分别有以下4个系数:
ERROR_CORRECT_L:7%的字码可被容错
ERROR_CORRECT_M:15%的字码可被容错
ERROR_CORRECT_Q:25%的字码可被容错
ERROR_CORRECT_H:30%的字码可被容错
box_size:控制二维码中每个小格子包含的像素数。
border:控制边框(二维码与图片边界的距离)包含的格子数(默认为4,是相关标准规定的最小值)
3、自定义二维码生成器
生成一个窗口,可以在输入框中自定义二维码的相关信息,包括想输入的文本(可以是文字或者网址),填充颜色以及背景颜色。代码如下:
if __name__ == '__main__':window = tk.Tk()window.title('二维码生成器')window.geometry('900x600')label_url = tk.Label(window, text="输入文本:")label_url.place(x=50, y=40)Entry_input_url = tk.Entry()Entry_input_url.place(x=120, y=40)label_fill_color = tk.Label(window, text="填充颜色:")label_fill_color.place(x=50, y=80)Entry_input_fill_color = tk.Entry()Entry_input_fill_color.place(x=120, y=80)label_fill_color = tk.Label(window, text="背景颜色:")label_fill_color.place(x=50, y=120)Entry_input_back_color = tk.Entry()Entry_input_back_color.place(x=120, y=120)button = tk.Button(window, text='开始生成', command=create_code)button.place(x=140, y=160)window.mainloop()
结果如下:
4、给二维码加图片
# 给二维码加图片# 把颜色模式转换为RGBA,它表示带透明度掩模的真彩色img = img.convert("RGBA")# 从文件里加载二维码中心logo图片,用Image函数的open方法icon = Image.open("2.jpg")# 得出二维码的宽高img_w, img_h = img.sizefactor = 4# 通过二维码宽高计算出logo图片宽和高的最大限度size_w = int(img_w / factor)size_h = int(img_h / factor)# 获取logo的宽和高icon_w, icon_h = icon.size# 比较logo宽高和最大限度宽高,如果超过最大限度就将logo尺寸调整到最大限度if icon_w > size_w:icon_w = size_wif icon_h > size_h:icon_h = size_hicon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)# 根据logo和图片的长宽确定logo的位置w = int((img_w - icon_w) / 2)h = int((img_h - icon_h) / 2)icon = icon.convert("RGBA")# 将logo图片粘贴到二维码的指定位置img.paste(icon, (w, h), icon)
5、全部代码
import qrcodeimport tkinter as tkfrom PIL import Imagedef create_code():content = Entry_input_url.get()fill_color = Entry_input_fill_color.get()back_color = Entry_input_back_color.get()qr = qrcode.QRCode(version=2, # 二维码的边长# ERROR_CORRECT_H: 30%的字码可被容错,因为插入了图片,所以增加容错率error_correction=qrcode.constants.ERROR_CORRECT_H,box_size=6,border=2,)qr.make(fit=True)qr.add_data(content)img = qr.make_image(fill_color=fill_color, back_color=back_color)# 给二维码加图片# 把颜色模式转换为RGBA,它表示带透明度掩模的真彩色img = img.convert("RGBA")# 从文件里加载二维码中心logo图片,用Image函数的open方法icon = Image.open("2.jpg")# 得出二维码的宽高img_w, img_h = img.sizefactor = 4# 通过二维码宽高计算出logo图片宽和高的最大限度size_w = int(img_w / factor)size_h = int(img_h / factor)# 获取logo的宽和高icon_w, icon_h = icon.size# 比较logo宽高和最大限度宽高,如果超过最大限度就将logo尺寸调整到最大限度if icon_w > size_w:icon_w = size_wif icon_h > size_h:icon_h = size_hicon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)# 根据logo和图片的长宽确定logo的位置w = int((img_w - icon_w) / 2)h = int((img_h - icon_h) / 2)icon = icon.convert("RGBA")# 将logo图片粘贴到二维码的指定位置img.paste(icon, (w, h), icon)# 保存二维码img.save("qr.png")photo = tk.PhotoImage(file="qr.png")Label_img = tk.Label(window, image=photo)Label_img.place(x=300, y=300)if __name__ == '__main__':window = tk.Tk()window.title('二维码生成器')window.geometry('900x600')label_url = tk.Label(window, text="输入文本:")label_url.place(x=50, y=40)Entry_input_url = tk.Entry()Entry_input_url.place(x=120, y=40)label_fill_color = tk.Label(window, text="填充颜色:")label_fill_color.place(x=50, y=80)Entry_input_fill_color = tk.Entry()Entry_input_fill_color.place(x=120, y=80)label_fill_color = tk.Label(window, text="背景颜色:")label_fill_color.place(x=50, y=120)Entry_input_back_color = tk.Entry()Entry_input_back_color.place(x=120, y=120)button = tk.Button(window, text='开始生成', command=create_code)button.place(x=140, y=160)window.mainloop()
6、结果
我还是喜欢绿色的码,因为看起来更健康,加入博主博客地址的二维码:
可恶的红码,加入一段话的二维码: