日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

基于Python編寫一個二維碼生成器_python

作者:Python編程學習圈 ? 更新時間: 2022-08-01 編程語言

前言

二維碼又稱二維條碼,常見的二維碼為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)

原文鏈接:https://mp.weixin.qq.com/s/7nHFlFr_oNJ2tTG2O5DFEw

欄目分類
最近更新