深入理解二维码生成尺寸

摘要:
版本范围从1到40。有一个值对应于允许填写数据长度的容错级别LMQH。什么是LMQH?如果错误级别设置为L,当错误级别为7%模糊或不完整时,QR码仍可扫描结果。如果错误级别设置为H,则结果为30%。容错级别越高越好,但填充的数据越少,二维码的大小也会变大。因此,当您生成二维码时,fit必须设置为true,因此您不必计算需要填充的数据的长度以匹配版本。如何意识到一些生成二维码的网站已经选择了大小?

详细了解二维码的原理,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,避免数据丢失。

当然,程序代码对这个地儿有判断的,当fit为False,填入数据大于版本规定数据时,会抛出DataOverflowError异常的:

Traceback (most recent call last):
  File "D:/thecover_project/cover_app_platform/app/test/test.py", line 118, in <module>124
    create_qr_code(content, icon_path, 'cs', save_path, 'H')
  File "D:/thecover_project/cover_app_platform/app/test/test.py", line 63, in create_qr_code
    qr.make(fit=False)
  File "C:UsersDELLPycharmProjectscover_app_platformvenvlibsite-packagesqrcodemain.py", line 95, in make
    self.makeImpl(False, self.best_mask_pattern())
  File "C:UsersDELLPycharmProjectscover_app_platformvenvlibsite-packagesqrcodemain.py", line 181, in best_mask_pattern
    self.makeImpl(True, i)
  File "C:UsersDELLPycharmProjectscover_app_platformvenvlibsite-packagesqrcodemain.py", line 122, in makeImpl
    self.data_cache = util.create_data(
  File "C:UsersDELLPycharmProjectscover_app_platformvenvlibsite-packagesqrcodeutil.py", line 573, in create_data
    raise exceptions.DataOverflowError(
qrcode.exceptions.DataOverflowError: Code length overflow. Data size (1004) > size available (368)

程序计算长度是根据标准里的(Number of data bits)判断的,我们自己判断的话,可以用Data capacity 里的Byte来参考。

version范围为1到40,都有容错级别LMQH对应的允许填入数据长度对应的值,LMQH是啥呢:

深入理解二维码生成尺寸第1张

 当若错级别设置为L时,二维码在模糊或残缺7%的情况下,还是可以扫描出结果的,H的话就是30%。

容错级别越高,肯定越好,但填充的数据就越少了,同时二维码的尺寸会变大。

ISOIEC 18004_2006Cor 1_2009(二维码ISO国际标准):

深入理解二维码生成尺寸第2张

 当version为9时,8位字节数L为230,M为180,Q为130,H为98,我这里是以Byte对应的标准来计算的。

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

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

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

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

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

深入理解二维码生成尺寸第3张

 纠错等级编码:

深入理解二维码生成尺寸第4张

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

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

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

深入理解二维码生成尺寸第5张

 其实只要事先确认要填充数据的值,再动态计算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就可以设置为False了。

 深入理解二维码生成尺寸第6张

 我要生成的大小为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即可!但是box_size的取值是被int了的:

深入理解二维码生成尺寸第7张

所以计算出来肯定是不会刚好合适的:

# version=12, border=1 对应的二维码尺寸与版本信息
# qr_size = {'6': 402, '9': 603, '12': 804, '15': 1005, '18': 1206, '23': 1541, '30': 2010, '38': 2546, '45': 3015}

上面是在version=12, border=1的情况下计算的二维码尺寸,那么我想生成1500尺寸的怎么办呢?

img = img.resize((1500, 1500), Image.ANTIALIAS)

用PIL的resize方法微调,把它拉升成需要的比例就行:按照公式计算的话,再被int一下,一般都会偏小,所以这里resize一般都会拉升,不会压缩,但生成的二维码,清晰度还是可以保障的,试了各种尺寸,都很清晰的。

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

 附上二维码的版本与容量表:

深入理解二维码生成尺寸第8张

 深入理解二维码生成尺寸第9张

 深入理解二维码生成尺寸第10张

 深入理解二维码生成尺寸第11张

 如有需要125页的二维码ISO国际标准pdf文档,可以留言发你。

免责声明:文章转载自《深入理解二维码生成尺寸》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NodeJS入门--环境搭建 IntelliJ IDEACAD画三维图怎么渲染?一分钟教你快速操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Robot Framework与Web界面自动化测试:简单例子

假设环境已经搭建好了。这里用RIDE( Robot Framework Test Data Editor)工具来编写用例。下面我们对Robot Framework简称rf。 我们先考虑下一个最基本的登录功能的测试用例。 一、自动化测试 与 人工测试 在开始编写用例之前,我们先来思考下自动化测试和人工测试的区别。对于web页面的人工测试,我们想下,如果去测试...

react学习记录(一)

一、React是什么 声明式写法(强调结果,命令式编程强调过程) 组件化 一次学习,随处编写(多种应用场景,web程序,原生手机应用,系统应用,命令行工具) 二、为什么学习react 大公司加持-facebook 最流行,使用人数最多,被开发者喜爱 简单易懂 三、配置开发环境 官方脚手架工具Creat-react-app,类似vue-cli 脚手架工具:是...

实全软件产品自动升级管理解决方案

实全软件产品自动升级管理解决方案 目 录 1. 描述... 1 2. 产品管理后台系统... 1 2.1. 产品发布... 1 2.2. 产品下载... 2 2.3. 下载日志... 3 2.4. 异常日志... 3 3. 产品Web Service服务接口... 3 3.1. 接口说明... 4 4. 产品升级更新程序... 4 4.1. 产品升级自动更...

Cloudify基本介绍

介绍 Cloudify 是开源的云编排框架,管理应用的整个生命周期,主要功能包括: 应用编排:blueprint,部署和管理 应用维护:工作流,事件和日志管理 可插拔:使用插件垒起来的 标准:基于TOSCA的DSL(领域描述语言) 术语 blueprint:cloudify 用blueprint 来定义应用,blueprint 是应用的逻辑展示,包括...

Android开发5:应用程序窗口小部件App Widgets的实现

前言   本次主要是实现一个Android应用,实现静态广播、动态广播两种改变 widget内容的方法,即在上篇博文中实验的基础上进行修改,所以此次实验的重点是AppWidget小部件的实现啦~   首先,我们简单说一下Widget是一个啥玩意~   应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收周期...

安装 jdk-8u121( jdk1.8 ) Eclipse jee neon java EE 4.6 并配置 中国科学技术大学 http://mirrors.ustc.edu.cn/eclipse/ 仓库源

官网太慢用百度网盘,打不开刷新几次试试 http://pan.baidu.com/s/1qYTUrGK#list/path=%2F 首先下载安装 jdk-8u121-windows-x64.exe (然后安装 eclipse-inst-win64.exe,eclipse的安装器,用来安装插件如JavaEE) 然后解压 eclipse neon4.6 f...