从零开始用Python生成码:自定义样式与Logo嵌入

想要从零开始学习用 Python 生成二维码(推测你说的 "码" 核心指二维码),并掌握自定义二维码样式(如颜色、大小、边框)和嵌入 Logo 的完整方法,这份指南会从环境搭建到实战实现,全程零基础友好,代码可直接复制运行。

一、前置环境准备

首先安装生成二维码和处理图片的核心库,qrcode负责生成二维码,Pillow(PIL)负责图片编辑(调整 Logo、自定义样式):

bash

复制代码
# 安装依赖库
pip install qrcode[pil] pillow
  • qrcode[pil]:包含 PIL 依赖的完整版二维码库,支持图片格式输出;
  • Pillow:Python 主流的图片处理库,用于 Logo 嵌入、颜色调整等。

二、基础二维码生成(无自定义)

先实现最基础的二维码生成,理解核心参数,为后续自定义打基础:

python

复制代码
import qrcode

# 1. 定义二维码内容(可替换为网址、文字、手机号等)
qr_content = "https://www.example.com"

# 2. 配置二维码基础参数
qr = qrcode.QRCode(
    version=1,  # 版本(1-40),数字越大二维码越复杂,可自动适配
    error_correction=qrcode.constants.ERROR_CORRECT_M,  # 容错率(M级:可容错15%)
    box_size=10,  # 每个小方格的像素大小
    border=4,  # 边框宽度(默认4,最小1)
)

# 3. 添加内容并生成二维码
qr.add_data(qr_content)
qr.make(fit=True)  # fit=True:自动适配版本

# 4. 生成图片并保存
img = qr.make_image(fill_color="black", back_color="white")  # 默认黑白样式
img.save("basic_qrcode.png")
print("基础二维码已保存为 basic_qrcode.png")

运行结果 :当前目录生成basic_qrcode.png,扫描可识别出https://www.example.com

三、自定义二维码样式(颜色 / 大小 / 边框)

基于基础版本,调整二维码的前景色、背景色、方格大小、边框宽度,实现个性化样式:

python

复制代码
import qrcode

# 1. 自定义参数配置
qr_content = "Python自定义二维码"
qr_version = 2  # 版本升级,适配更多内容
qr_box_size = 15  # 方格更大,二维码整体尺寸增加
qr_border = 2  # 缩小边框
# 自定义颜色(支持英文颜色名、RGB值)
fore_color = (220, 38, 38)  # 红色RGB
back_color = (245, 245, 245)  # 浅灰色RGB

# 2. 生成二维码
qr = qrcode.QRCode(
    version=qr_version,
    error_correction=qrcode.constants.ERROR_CORRECT_H,  # 高容错率(可容错30%),方便后续嵌入Logo
    box_size=qr_box_size,
    border=qr_border,
)
qr.add_data(qr_content)
qr.make(fit=True)

# 3. 生成带自定义颜色的图片
img = qr.make_image(fill_color=fore_color, back_color=back_color)
img.save("custom_style_qrcode.png")
print("自定义样式二维码已保存为 custom_style_qrcode.png")

关键参数说明

  • error_correction:容错率越高,二维码被遮挡(如 Logo 覆盖)后仍能识别,嵌入 Logo 建议用ERROR_CORRECT_H(最高级);
  • fill_color/back_color:支持"red"等英文名称,也支持(R,G,B)RGB 值(范围 0-255),实现精准配色;
  • box_size:控制二维码整体大小,值越大生成的图片像素越高。

嵌入 Logo 的核心逻辑是:先生成二维码图片,再读取 Logo 图片,调整 Logo 大小(避免遮挡过多),将 Logo 居中合并到二维码上。

python

复制代码
import qrcode
from PIL import Image
import os

def generate_qrcode_with_logo(
    content, 
    save_path="qrcode_with_logo.png",
    logo_path="logo.png",  # Logo图片路径(建议用正方形图片,如png格式)
    qr_box_size=10,
    qr_border=2,
    fore_color="black",
    back_color="white",
    logo_scale=0.2  # Logo大小为二维码的20%(建议0.15-0.25)
):
    """
    生成带Logo的自定义二维码
    :param content: 二维码内容
    :param save_path: 保存路径
    :param logo_path: Logo图片路径
    :param qr_box_size: 二维码方格大小
    :param qr_border: 二维码边框
    :param fore_color: 二维码前景色
    :param back_color: 二维码背景色
    :param logo_scale: Logo相对二维码的大小比例
    """
    # 步骤1:生成基础二维码(高容错率)
    qr = qrcode.QRCode(
        version=None,  # 自动适配版本
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=qr_box_size,
        border=qr_border,
    )
    qr.add_data(content)
    qr.make(fit=True)
    qr_img = qr.make_image(fill_color=fore_color, back_color=back_color).convert("RGBA")

    # 步骤2:校验Logo文件是否存在
    if not os.path.exists(logo_path):
        raise FileNotFoundError(f"Logo文件不存在:{logo_path}")
    
    # 步骤3:读取并处理Logo图片
    logo_img = Image.open(logo_path).convert("RGBA")
    # 计算Logo大小(基于二维码尺寸)
    qr_width, qr_height = qr_img.size
    logo_width = int(qr_width * logo_scale)
    logo_height = int(qr_height * logo_scale)
    # 调整Logo大小(保持比例)
    logo_img = logo_img.resize((logo_width, logo_height), Image.Resampling.LANCZOS)

    # 步骤4:计算Logo居中位置
    pos_x = (qr_width - logo_width) // 2
    pos_y = (qr_height - logo_height) // 2

    # 步骤5:合并Logo到二维码
    qr_img.paste(logo_img, (pos_x, pos_y), logo_img)  # 第三个参数是透明通道,保留Logo透明背景

    # 步骤6:保存最终图片
    qr_img.save(save_path)
    print(f"带Logo的二维码已保存为:{save_path}")

# 调用函数生成二维码
if __name__ == "__main__":
    # 替换为你的内容和Logo路径
    generate_qrcode_with_logo(
        content="https://www.example.com",
        save_path="my_qrcode.png",
        logo_path="logo.png",  # 请将此替换为你的Logo图片路径(如本地的logo.png)
        qr_box_size=12,
        fore_color=(0, 123, 255),  # 蓝色RGB
        back_color="white",
        logo_scale=0.2
    )

关键说明(新手必看)

  1. Logo 图片要求
    • 建议用正方形 PNG 图片(支持透明背景,效果更好);
    • 避免用过大的 Logo(比例建议 0.15-0.25),否则遮挡二维码核心区域导致无法识别;
  2. 透明通道处理paste方法的第三个参数logo_img保留了 Logo 的透明背景,若 Logo 是 JPG(无透明),可去掉该参数;
  3. 常见问题解决
    • 二维码无法识别:调高容错率(ERROR_CORRECT_H)、缩小 Logo 比例、检查二维码内容是否过长;
    • Logo 显示异常:确保 Logo 图片路径正确,优先用 PNG 格式,JPG 需确认无损坏;
  4. 颜色适配:前景色和背景色对比要强烈(如深色前景 + 浅色背景),避免相近色导致扫描失败。
相关推荐
前端那点事16 小时前
Vue面试高频:子组件能直接修改父组件数据吗?单向数据流原理+正确写法全覆盖
前端·vue.js
前端那点事16 小时前
为什么 Vue 的 template 标签不能用 v-show?底层机制+踩坑复盘+生产级解决方案
前端·vue.js
晚霞的不甘17 小时前
CANN Catlass 矩阵乘模板库深度解析:高性能矩阵运算的进阶之路
人工智能·python·线性代数·矩阵
weelinking17 小时前
【claude】14_Claude作为技术文档助手
前端·人工智能·react.js·数据挖掘·前端框架
天问一17 小时前
router路由类型和使用方法
开发语言·javascript·ecmascript
jiayong2317 小时前
前端面试题库 - JavaScript核心基础篇
前端·javascript·面试
软件技术NINI17 小时前
泉州html+css 4页
前端·javascript·css·html
再吃一根胡萝卜17 小时前
OpenScreen:免费开源的录屏神器,做出专业级演示视频
前端
小白学大数据17 小时前
深度探索:Python 爬虫实现豆瓣音乐全站采集
开发语言·爬虫·python·数据分析
用户67570498850217 小时前
Celery 太重了?这可能是你一直在找的 asyncio 任务队列
后端·python·消息队列