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
相关产品推荐
相关产品推荐

