首頁 > 軟體

基於Python編寫一個二維條碼生成器

2022-06-07 14:06:47

前言

二維條碼又稱二維條碼,常見的二維條碼為QR Code,QR全稱Quick Response,是一個近幾年來移動裝置上超流行的一種編碼方式,它比傳統的Bar Code條形碼能存更多的資訊,也能表示更多的資料型別。現在的二維條碼隨處可見,甚至有人覺得在以後的墓碑上都可以刻一個二維條碼,通過掃描該二維條碼便可知墓主傳奇的一生。所以如何快速客製化自己的二維條碼便顯得極為的重要,本文用python生成一個簡單的二維條碼生成器,該生成器可以客製化二維條碼的背景、填充顏色以及二維條碼中間的背景圖片。

1、安裝第三方庫

win+R,輸入cmd,進入系統管理員介面,安裝第三方庫

pip install qrcode
pip 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.size
    factor = 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_w
    if icon_h > size_h:
        icon_h = size_h
    icon = 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、全部程式碼

window.mainloop()

import qrcode
import tkinter as tk
from PIL import Image
 
 
def 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.size
    factor = 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_w
    if icon_h > size_h:
        icon_h = size_h
    icon = 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)

到此這篇關於基於Python編寫一個二維條碼生成器的文章就介紹到這了,更多相關Python二維條碼生成器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com