首页 > 其他 > 详细

深入理解二维码

时间:2021-04-19 23:49:04      阅读:25      评论:0      收藏:0      [点我收藏+]

详细了解二维码的原理,CSDN这两篇博客不错:

转自MachineChen的博客:http://blog.csdn.net/u012611878/article/details/53167009

转自琦小虾的博客:https://blog.csdn.net/ajianyingxiaoqinghan/article/details/78837864

我理解的二维码生成尺寸,验证了一下:

# 生成二位码
def create_qr_code(url, icon_file, file_name, save_path, ec=H):
    ecn = 2
    if ec == "L":
        ecn = qrcode.ERROR_CORRECT_L
    if ec == M:
        ecn = qrcode.ERROR_CORRECT_M
    if ec == Q:
        ecn = qrcode.ERROR_CORRECT_Q
    if ec == H:
        ecn = qrcode.ERROR_CORRECT_H
    version = 6
    box_size = 5
    border = 1
    qr = qrcode.QRCode(
        version=version,
        # 设置容错率为最高
        error_correction=ecn,
        box_size=box_size,
        border=border,
    )
    qr_size = (21 + (version - 1) * 4 + border * 2) * box_size

二维码的尺寸与这几个参数有关:version ,border ,box_size,具体计算公式如下:

qr_size = (21 + (version - 1) * 4 + border * 2) * box_size

比如上面的代码:qr_size = (21 + (6 - 1) * 4 + 1* 2) * 5 = 215

但这个的计算公式是建立在一个参数的前提下:

qr.make(fit=True)

当然,我用的是qrcode

import qrcode
:param fit: If ``True`` (or if a size has not been provided), find the
            best fit for the data to avoid data overflow errors.

当fit为True时,会根据二维码填充的数据而自动匹配version,避免数据丢失。

但根据什么来适配version呢,其实是有标准的,version范围为1到40,都有对应的LMQH值,根据ISOIEC 18004_2006Cor 1_2009(二维码ISO国际标准)

技术分享图片

 

 当version为9时,8位字节数L为230,M为180,Q为130,H为98。

也就是说,如果我的纠错级别为H,我的填充内容则不能超过98个8位字节,比如我要填充的跳转url为99个,则version会自动匹配10。

所以当你生成二维码时,fit一定要设置为True,这样就不用去计算你要填入的数据的长度来匹配version了。

还有一点,有人和我一样去翻qrcode源代码时,有点疑惑:

constants.py里维护的LMQH级别为什么是1,0,3,2,而不是0,1,2,3?最开始我也弄迷糊了,也为源代码错了,还打算修改这个地方,经过多次验证,发现是对的,

后来研究了一下文档,才发现,这里其实是二进制转换成的十进制,哈哈:

技术分享图片

 

 纠错等级编码:

技术分享图片

 

所以当你要填入的数据小于对应的允许值时,尺寸计算公式可以直接带入参数计算,当你的fit为True,填入数据又大于version对应的值时,会自动匹配计算尺寸,

这时二维码的大小就不是你之前期望的了。感兴趣的可以自己验证。

那一些生成二维码的网站上有选择尺寸的大小,是怎么实现的呢?比如联图网:https://www.liantu.com:

技术分享图片

 

 其实只要事先确认要确认填充数据的值,再动态计算box_size就行:

content = "itms-se://?action=download-manifest&url=https://pkgXX.theXXver.cn/pkg/cover/plist/fm_cm_iOS/7.0.0/fm_cm_iOS1243.plist"
print(len(content))
icon_path = /Users/drew/.jenkins/workspace/Android-xx/app/src/main/res/mipmap-xxhdpi/ic_collect_icon.png
save_path = /Users/Work/PycharmProjects/FM_Build_Packaging/resources/img/qrcode
create_qr_code(content, icon_path, cs, save_path, H)

1.如上内容,计算出content长度为118(这里可以预估可能的最大长度),容错级别为H,version 10刚好满足,当然你可以设置更大一点的version,这样,fit就可以设置为Fals了,最多做个判断,

当要填充的数据大于你设置的长度时告警或禁止生成,至少不会数据溢出。

 技术分享图片

 

 我要生成的大小为1500px,带入公式求出box_size():

version = 10
box_size = ?
border = 1
size = 1500

1500 = (21 + (10- 1) * 4 + 1* 2) * box_size, 算出box_size = 25.42。

则生成二维码时,box_size设置为25.42即可!

以上,python 的 qrcode生成二维码的尺寸的个人拙见。

 

深入理解二维码

原文:https://www.cnblogs.com/drewgg/p/14678642.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!