一、一般二維碼
qrcode是個用來生成二維碼圖片的第三方模塊,先安裝:
pip install qrcode
import qrcode def process(self, msgs, user=None): qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) qr.add_data(msgs.value) qr.make(fit=True) img = qr.make_image() filemgr = FileMgr('log/wechat_files/') img_path = filemgr.make_path('.png') img.save(img_path) return TaskRsp(end=True,msgs=[TypedMessage(type='pic', value=img_path)])
QRCode參數詳細說明:
- version: 一個整數,范圍為1到40,表示二維碼的大小(最小值是1,是個12×12的矩陣),如果想讓程序自動生成,將值設置為 None 並使用 fit=True 參數即可。
- error_correction: 二維碼的糾錯范圍,可以選擇4個常量:
ERROR_CORRECT_L 7%以下的錯誤會被糾正
ERROR_CORRECT_M (default) 15%以下的錯誤會被糾正
ERROR_CORRECT_Q 25 %以下的錯誤會被糾正
ERROR_CORRECT_H. 30%以下的錯誤會被糾正 - boxsize: 每個點(方塊)中的像素個數
- border: 二維碼距圖像外圍邊框距離,默認為4,而且相關規定最小為4
二、內置圓角logo的二維碼
一般的二維碼太丑,需要內置一個logo,為了美觀還要對logo進行圓角處理
import qrcode from PIL import Image, ImageDraw # 設置圓角 def circle_crop_image(im, radii): # 創建一個黑色背景的畫布 circle = Image.new('L', (radii * 2, radii * 2), 0) # 畫黑色方形 draw = ImageDraw.Draw(circle) # 畫白色圓形 draw.ellipse((0, 0, radii * 2, radii * 2), fill=255) # 把原圖轉換成RGBA模式,增加alpha通道 img = im.convert("RGBA") w, h = img.size # 畫4個角(將整圓分離為4個部分)再粘貼到alpha通道 alpha = Image.new('L', img.size, 255) # 左上角 alpha.paste(circle.crop((0, 0, radii, radii)), (0, 0)) # 右上角 alpha.paste(circle.crop((radii, 0, radii * 2, radii)), (w - radii, 0)) # 右下角 alpha.paste(circle.crop((radii, radii, radii * 2, radii * 2)), (w - radii, h - radii)) # 左下角 alpha.paste(circle.crop((0, radii, radii, radii * 2)), (0, h - radii)) # 白色區域透明可見,黑色區域不可見 img.putalpha(alpha) return img # 生成二維碼 def create_qr_code(url): qr = qrcode.QRCode( version=2, # 設置容錯率為最高 error_correction=qrcode.ERROR_CORRECT_H, box_size=10, border=1, ) qr.add_data(url)
qr.make(fit=True) # 創建二維碼圖片 img = qr.make_image() # 圖片轉換為RGBA格式 img = img.convert("RGBA") # 打開logo圖片 icon = Image.open('log/wechat_files/222.png') # 把RGB的圖轉換成RGBA模式,處理alpha透明通道(后邊替換透明為白色) icon = icon.convert("RGBA") w, h = img.size icon_w, icon_h = icon.size # logo大小超過100的壓縮到100,這個可以自己設置,影響logo的大小 if icon_w > 111: icon = icon.resize((111, 111), Image.ANTIALIAS) icon_w, icon_h = icon.size w = int((w - 111) / 2) h = int((h - 111) / 2) else: w = int((w - icon_w) / 2) h = int((h - icon_h) / 2) # 把png背景色轉換為白色,避免處理裁剪圓角時出現黑邊 w_d = Image.new('RGBA', icon.size, (255, 255, 255)) w_d.paste(icon, (0, 0, icon_w, icon_h), icon) # r = icon_w // 15 # 圓角半徑 r = 15 icon = circle_crop_image(w_d, r) # 白底圖,15的數值影響白色底圖的大小 white_img = Image.new("RGBA", (icon_w + 15, icon_h + 15), (255, 255, 255)) white_img = circle_crop_image(white_img, r) # 灰底圖 gray_img = Image.new("RGBA", (icon_w + 2, icon_h + 2), (230, 230, 230)) # 灰底圖圓角處理 gray_img = circle_crop_image(gray_img, r) # 粘貼灰底圖 white_img.paste(gray_img, (2, 2), gray_img) # 粘貼白圖 img.paste(white_img, (w - 2, h - 2), white_img) # 粘貼icon,(w + 5, h + 5)為左上角坐標,數值大小配合white_img的數值大小調整,影響白色邊框的寬度 img.paste(icon, (w + 5, h + 5), icon) img_path = 'D:\\xxoo.png' img.save(img_path, quality=100) # img.show() print(img_path) return img_path create_qr_code('www.baidu.com')
三、myqr庫生成動態二維碼
圖片本來是動態的,到這就不懂了,哈哈
from MyQR import myqr def get_qrcode(dir): img_path = 'D:\\xxoo.png'print(img_path) myqr.run(words=dir, # words中填寫鏈接或者文本內容 version=3, # 控制二維碼大小 1~40,建議不要超過5,否則生成時間太長 level='H', # 控制糾錯水平,范圍是L、M、Q、H,從左到右依次升高 picture='log/wechat_files/111.gif', # 背景圖片,格式可以是.jpg, .png, .bmp, .gif colorized=True, # 可以使產生的圖片由黑白(False)變為彩色(True)的 contrast=1.3, # 用以調節圖片的對比度,1.0 表示原始圖片,更小的值表示更低對比度,更大反之。默認為1.0。 brightness=1.3, # 用來調節圖片的亮度 save_dir='log/wechat_files/',) # 保存目錄 # get_qrcode('http://www.baidu.com')
下面來個騷的,效果自己去看吧,哈哈,泡妹子神器:
from MyQR import myqr def get_qrcode(dir): myqr.run(words=dir, # words中填寫鏈接 version=3, # 控制二維碼大小 1~40,建議不要超過5,否則生成時間太長 level='H', # 控制糾錯水平,范圍是L、M、Q、H,從左到右依次升高 picture='timg.gif', # 你想放的動態圖片path,網上下載就好了, colorized=True, # 可以使產生的圖片由黑白(False)變為彩色(True)的 contrast=1.3, # 用以調節圖片的對比度,1.0 表示原始圖片,更小的值表示更低對比度,更大反之。默認為1.0。 brightness=1.3, # 用來調節圖片的亮度 save_dir='log/wechat_files/',) # 保存目錄 get_qrcode('https://a.scene.eprezi.com/s/XteInz0v?adpop=1')
參考:
https://www.cnblogs.com/drewgg/p/12762053.html
https://www.cnblogs.com/small-bud/p/12381887.html