網站首頁 編程語言 正文
前言
二維碼又稱二維條碼,常見的二維碼為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
相關推薦
- 2022-07-22 CSS3過渡與動畫
- 2022-10-04 Qt實現右擊菜單項_C 語言
- 2022-11-03 C++命名空間使用詳細介紹_C 語言
- 2022-01-31 jq監聽input type="file"發生改變,即選擇文件,并獲取文件名稱
- 2022-05-29 Docker鏡像與容器的導入導出操作實踐_docker
- 2022-09-26 docker已啟動容器修改添加端口映射的兩種方法_docker
- 2022-01-15 let、var、const區別
- 2022-12-04 WxPython界面如何用pubsub展示進程工作的進度條_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支