• 示例代码1
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# author: Carl time:2020/5/15


import qrcode
from PIL import Image, ImageFile, ImageDraw

ImageFile.LOAD_TRUNCATED_IMAGES = True


# 设置中心图片四周圆角
def circle_crop_image(im):
    rad = 10  # 设置半径
    circle = Image.new('L', (rad * 2, rad * 2), 0)
    draw = ImageDraw.Draw(circle)
    draw.ellipse((0, 0, rad * 2, rad * 2), fill=255)
    alpha = Image.new('L', im.size, 255)
    w, h = im.size
    alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
    alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
    alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
    alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
    im.putalpha(alpha)
    return im


# 生成二位码
def create_qr_code(url, file_name, icon_file=None):
    qr = qrcode.QRCode(
        version=5,
        # 设置容错率为最高
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=6,
        border=4,
    )
    qr.add_data(url)
    # 添加二维码内容,可以直接是字符串文本,也可url链接

    qr.make(fit=True)

    img = qr.make_image(fill_color="#3ac25b", back_color="#FFF")
    # 设置二维码为彩色
    img = img.convert("RGBA")
    if icon_file:
        icon = Image.open(icon_file)
        w, h = img.size
        factor = 4
        size_w = int(w / factor)
        size_h = int(h / factor)
        icon_w, icon_h = icon.size
        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)
        w = int((w - icon_w) / 2)
        h = int((h - icon_h) / 2)
        icon = icon.convert("RGBA")

        # ------以下是进一步处理中心图片,可省略------
        # 白底图
        white_img = Image.new("RGBA", (icon_w + 6, icon_h + 6), (255, 255, 255))
        # 白底图圆角处理
        # white_img = circle_crop_image(white_img)
        # 灰底图
        gray_img = Image.new("RGBA", (icon_w + 2, icon_h + 2), (230, 230, 230))
        # 灰底图圆角处理
        gray_img = circle_crop_image(gray_img)
        # 粘贴灰底图
        white_img.paste(gray_img, (2, 2))
        # 粘贴白图
        img.paste(white_img, (w - 2, h - 2))
        # icon处理圆角
        icon = circle_crop_image(icon)
        # ----------------以上----------------

        # 粘贴icon
        img.paste(icon, (w + 1, h + 1))
    img.show()
    img.save('' + file_name + '.png', quality=100)


icon_path = "logo.jpg"  # 中心图片
create_qr_code('http://www.baidu.com', "hnww", "logo.jpg")
  • 示例代码2----中心图片周围有白边

# coding = utf-8
# 二维码生成

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, icon_file, file_name, save_path):
    qr = qrcode.QRCode(
        version=5,
        # 设置容错率为最高
        error_correction=qrcode.ERROR_CORRECT_H,
        box_size=6,
        border=4,
    )
    qr.add_data(url)
    qr.make(fit=True)
    img = qr.make_image(fill_color="#3ac25b", back_color="#FFF")
    img = img.convert("RGBA")
    icon = Image.open(icon_file)
    # 把RGB的图转换成RGBA模式,处理alpha透明通道(后边替换透明为白色)
    icon = icon.convert("RGBA")
    w, h = img.size
    icon_w, icon_h = icon.size
    # 超过80的压缩到80
    if icon_w > 80:
        icon = icon.resize((80, 80), Image.ANTIALIAS)
        icon_w, icon_h = icon.size
        w = int((w - 80) / 2)
        h = int((h - 80) / 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 = 6
    icon = circle_crop_image(w_d, r)
    # 白底图(尺寸大小)
    white_img = Image.new("RGBA", (icon_w+20, icon_h+20), (255, 255, 255))
    white_img = circle_crop_image(white_img, r)
    # 灰底图
    gray_img = Image.new("RGBA", (icon_w, icon_h), (230, 230, 230))
    # 灰底图圆角处理
    gray_img = circle_crop_image(gray_img, r)
    # 粘贴灰底图(起点坐标 = (白图长 - 灰图长) / 2)
    white_img.paste(gray_img, (10, 10), gray_img)
    # 粘贴白图(位置起点坐标)
    img.paste(white_img, (w-5, h-5), white_img)
    # 粘贴icon(起点坐标)
    img.paste(icon, (w + 5, h + 5), icon)
    save_file = save_path + file_name + '.png'
    img.save(save_file, quality=100)
    # img.show()
    return save_file


if __name__ == '__main__':
    icon_path = 'logo.jpg'
    save_path = 'E:/qt_demo/'
    create_qr_code('http://www.zhousc.cn', icon_path, 'cs', save_path)
  • 参考链接
  1. QRCode二维码生成和识别
  2. qrcode库生成二维码时填充logo变成黑白色的解决
  3. Python 生成带Logo的圆角带边框二维码
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐