赛博红兔的科技博客

CyberHongTu shares news, insights, and musings on fascinating technology subjects.


用Python制作带Logo的二维码

大家好,欢迎回到“Python五分钟”,我是赛博红兔。最近我工作比较忙,不太有时间来搞大的视频教学。所以就多推荐一些Python实用的小程序。今天,教给大伙的是怎么用Python制作带Logo的二维码的小程序。那么平时如果要制作宣传海报、分享网站或者链接、产品追溯物流管控、婚礼庆典、社交账号推广等等,咱们都可以轻松生成属于自己的二维码,扫一下就可以了。甚至做一个带二维码的狗牌也是很流行的。我已经把代码上传到了GitHub,有需要的朋友可以现取现用啊。

接下来打开脚本,我来简单介绍一下这个小程序。首先,我们会用两个第三方库:

  1. qrcode:是专门生成二维码的库。
  2. Pillow:是用来打开、缩放和粘贴图片也就是二维码的logo的。
import qrcode
from PIL import Image  # 用来处理图片

# 用户输入要生成的 QR 码内容和文件名
data = input("请输入要生成QR码的文本或网址: ").strip()
filename = input("请输入保存文件名: ").strip() + ".png"

# 创建二维码对象
qr = qrcode.QRCode(
    box_size=10,     # 每个小方块的像素大小
    border=4         # 边框宽度(单位:方块数)
)
qr.add_data(data)
qr.make(fit=True)  # 自动调整大小

# 生成二维码图片(黑白)
img = qr.make_image(fill_color='black', back_color='white').convert('RGB')

# 嵌入Logo
logo_path = "logo.png"
try:
    logo = Image.open(logo_path)

    # 计算Logo显示大小
    qr_width, qr_height = img.size
    logo_size = qr_width // 5
    logo = logo.resize((logo_size, logo_size))

    # 计算Logo放置位置
    pos = ((qr_width - logo_size) // 2, (qr_height - logo_size) // 2)
    # logo=logo.convert('RGBA') # 如果Logo没有透明通道先使用这段代码
    img.paste(logo, pos, mask=logo)
except FileNotFoundError:
    print("未找到logo.png, 将生成无Logo的二维码")

# 保存最终二维码
img.save(filename)
print(f'二维码已保存为 {filename}')

接下来,我们先要获取用户输入的二维码内容。第一行用input来输入用户的二维码内容,可以是文字、网址、链接等等信息。strip方法是用来去掉首尾空格,避免不小心多输空格导致链接无效。第二行输入二维码的文件名,然后直接在后面加上图片后缀.png。然后我们就需要创建二维码对象并且塞入数据。用QRCode构造器生成一个二维码对象。二维码是由很多小方块组成的,box_size参数决定一个小方块有多大像素。数值越大,生成图越大、越清晰。border参数决定外边留几格空白。留白太小可能会影响扫码识别。我们用add_data方法把上面用户输入的内容装进二维码。最后让库自动调整大小,可以把内容完整地塞进去。然后,我们用make_image方法生成最终的二维码图像。这里,我们选择黑白二维码,你也可以修改成彩色。注意,这里的convert(‘RGB’)是把图片模式统一成RGB格式,这是为了后面和Logo合成的时候更加有兼容性。

我们还可以把自己想要的logo放在二维码上。这里我们指定要嵌入的Logo文件路径,并尝试用Image.open来打开。这里用try/except结构是避免文件不存在的时候报错。我们计算Logo显示大小,可以通过logo_size来调整大小,然后计算Logo放置的位置。这里我们把logo居中放置。用img.paste把Logo粘贴到二维码上。如果系统没有找到logo,那么继续用上面“纯二维码”的方案。最后,程序会把完成的二维码保存,并且打印执行的结果。现在我们试试成果。把我的博客网址做成一个带有赛博红兔logo的二维码。

就这么简单!用这个脚本,你就可以随时随地轻松拥有自己的二维码了,你学会了吗?



Leave a comment