You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用Python生成自定义点形状的QR码?

Python生成圆点样式自定义QR码实现方案

完全可以实现,以下是两种可直接落地的实现路径,生成效果可完全匹配参考图的圆点QR码样式:

方案1:基于Segno库快速实现(推荐,适配成本最低)

Segno原生支持QR码模块形状自定义,不需要手动编写逐点绘制逻辑,几行代码即可生成可正常识别的圆点QR码:

  • 先安装所需依赖:
    pip install segno pillow
  • 核心实现代码:
import segno

# 初始化QR码对象,纠错等级选最高的H级,避免改形后识别失败
qr = segno.make("需要写入QR码的文本/链接内容", error='H')
# 导出圆点样式QR码
qr.to_pil(
    scale=10,  # 整体缩放比例,数值越大导出图片分辨率越高
    dark='#000000',  # 码点颜色
    light='#ffffff', # 背景色
    finder_dark='#000000', # 三角定位块颜色
    module_drawer='circle', # 核心配置:将默认方形码点替换为圆形
    border=2 # 二维码四周留白边距
).save("circle_style_qr.png")

该方案生成的圆点码点间隙均匀,三个角的定位块会自动保留标准QR码识别结构,不会因为码点改形出现扫码失败的问题。如果需要其他点形(菱形、圆角方形等),只需修改module_drawer对应的参数值即可。

方案2:基于qrcode+Pillow自定义绘制(适合高度定制化需求)

如果需要实现更特殊的点形效果(比如渐变圆点、自定义图标码点),可以通过基础QR码库获取码点二维矩阵,手动控制每个位置的绘制逻辑:

  • 安装依赖:
    pip install qrcode pillow
  • 核心实现代码:
import qrcode
from PIL import Image, ImageDraw

# 生成QR码基础矩阵
qr = qrcode.QRCode(
    version=None,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=2,
)
qr.add_data("需要写入QR码的文本/链接内容")
qr.make(fit=True)
code_matrix = qr.get_matrix()
box_size = qr.box_size
border_width = qr.border
img_size = (len(code_matrix) + border_width * 2) * box_size

# 创建空白画布
qr_img = Image.new("RGB", (img_size, img_size), "white")
draw = ImageDraw.Draw(qr_img)

# 遍历所有码点位置逐点绘制
for row_idx in range(len(code_matrix)):
    for col_idx in range(len(code_matrix)):
        # 定位三个角的定位块区域,保留标准方形结构保证识别率
        is_finder_area = (row_idx < 7 and col_idx <7) or \
                        (row_idx <7 and col_idx > len(code_matrix)-8) or \
                        (row_idx > len(code_matrix)-8 and col_idx <7)
        if is_finder_area:
            if code_matrix[row_idx][col_idx]:
                x0 = (col_idx + border_width) * box_size
                y0 = (row_idx + border_width) * box_size
                draw.rectangle([x0, y0, x0+box_size, y0+box_size], fill="black")
            continue
        # 普通码点位置绘制圆形
        if code_matrix[row_idx][col_idx]:
            center_x = (col_idx + border_width)*box_size + box_size//2
            center_y = (row_idx + border_width)*box_size + box_size//2
            radius = box_size//2 - 1 # 留1px间隙避免相邻圆点粘连
            draw.ellipse(
                [center_x-radius, center_y-radius, center_x+radius, center_y+radius],
                fill="black"
            )

qr_img.save("custom_circle_qr.png")

实现注意事项

  • 无论用哪种方案,都建议把QR码纠错等级开到最高(H级,可容忍30%左右的码面遮挡/形变),大幅降低改形后的识别失败概率
  • 三个角的定位块不要改成圆形,必须保留标准的方形嵌套结构,否则大部分扫码设备无法正常识别
  • 如果需要叠加logo、做渐变彩色效果,直接在生成的PIL图像对象上做二次绘制即可,逻辑和普通图片处理完全一致

参考效果如下:
圆点样式QR码参考图

内容的提问来源于stack exchange,提问作者Mahfujul Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:12:29