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

Python使用qrcode 7.3.1生成二维码如何减少黑色填充占比

降低qrcode 7.3.1生成二维码黑色填充占比的可行方案

针对Odoo11自定义模块开发场景,按落地优先级排序如下:

1. 前置压缩编码内容长度(效果最明显)

二维码的总模块数(即黑白小方块总数量)由编码内容长度、纠错等级共同决定,长URL是触发高版本二维码、黑块密度过高的核心原因:

  • 不要直接把原始长URL传入生成接口,在Odoo内自建短链映射逻辑:给每个长URL生成6-8位的唯一短码,绑定Odoo路由(如/s/[短码]),将短链接传入二维码生成接口,内容长度通常能压缩70%以上,生成的二维码版本可从20+降到5以内,黑块占比会出现断崖式下降。
  • 短链实现完全不需要依赖第三方服务,直接复用Odoo的控制器、ORM能力即可:短码存在自定义模型里加唯一约束,控制器收到短链请求直接302跳转到对应原URL,数据完全自主可控,适配Odoo11的技术栈。

2. 调整qrcode库内置生成参数

不需要改库源码,直接调整初始化参数即可实现明显优化:

  • 调低纠错等级:库默认使用ERROR_CORRECT_M(15%纠错能力),如果你的二维码用于屏幕展示、无污损的正规印刷场景,直接切换到ERROR_CORRECT_L(7%纠错能力),冗余数据量减少一半以上,同内容下可选用更低的二维码版本,黑块数量明显降低。非必要不要使用ERROR_CORRECT_Q(25%纠错)、ERROR_CORRECT_H(30%纠错)等级,这两个等级冗余数据占比过高,长URL场景下黑块密度会非常高。
  • 保持版本自动适配:初始化QRCode类时不要手动指定过高的version值,调用make()方法时必须传入fit=True,让库自动选择能承载内容的最小版本,避免不必要的模块数量增加。
  • 不要随意缩小border参数:标准二维码要求至少4个模块宽度的空白静区,缩小边框会直接导致扫码识别率下降,对降低黑块占比没有实质帮助。

参考代码:

import qrcode
from qrcode.constants import ERROR_CORRECT_L

# Odoo11环境下注意提前固定依赖:qrcode==7.3.1,Pillow<9.0.0兼容Python3.5/2.7
def generate_qrcode(long_url):
    # 替换为自定义短链逻辑返回的短地址
    short_url = get_short_url(long_url)
    qr = qrcode.QRCode(
        version=None,
        error_correction=ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(short_url)
    qr.make(fit=True)
    # 保持黑块白底即可,不要反色
    img = qr.make_image(fill_color="black", back_color="white")
    return img

3. 自定义掩码选择逻辑(进阶优化)

qrcode 7.3.1内置8种数据区掩码规则,默认会选择综合惩罚分(含相邻模块惩罚、黑白占比失衡惩罚等)最低的掩码,你可以扩展这部分逻辑进一步降低黑块占比:

  • 遍历8种掩码分别生成数据区矩阵,跳过定位块、时序图案、格式信息等固定不可修改的结构,统计每个合法矩阵中值为1(对应黑色填充)的模块占比
  • 优先选择黑块占比最低的合法矩阵输出即可,该调整不会破坏二维码标准结构,不影响扫码识别率。

注意:不要通过缩小box_size(单模块像素尺寸)的方式降低视觉上的黑块密度,该操作只会让整张二维码尺寸变小,不会改变黑块的实际占比,过小的模块尺寸还会导致扫码识别困难。不要将二维码做反色处理(即白色模块+黑色背景),该操作会直接让黑色填充占比超过70%,和优化目标完全相反。

内容的提问来源于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:06:25