python的qrcode庫生成二維碼 圓角logo二維碼 myqr庫生成動態二維碼


一、一般二維碼

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM