深入理解二維碼生成尺寸


詳細了解二維碼的原理,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:\Users\DELL\PycharmProjects\cover_app_platform\venv\lib\site-packages\qrcode\main.py", line 95, in make
    self.makeImpl(False, self.best_mask_pattern())
  File "C:\Users\DELL\PycharmProjects\cover_app_platform\venv\lib\site-packages\qrcode\main.py", line 181, in best_mask_pattern
    self.makeImpl(True, i)
  File "C:\Users\DELL\PycharmProjects\cover_app_platform\venv\lib\site-packages\qrcode\main.py", line 122, in makeImpl
    self.data_cache = util.create_data(
  File "C:\Users\DELL\PycharmProjects\cover_app_platform\venv\lib\site-packages\qrcode\util.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是啥呢:

 當若錯級別設置為L時,二維碼在模糊或殘缺7%的情況下,還是可以掃描出結果的,H的話就是30%。

容錯級別越高,肯定越好,但填充的數據就越少了,同時二維碼的尺寸會變大。

ISOIEC 18004_2006Cor 1_2009(二維碼ISO國際標准):

 當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?最開始我也弄迷糊了,也為源代碼錯了,還打算修改這個地方,經過多次驗證,發現是對的,

后來研究了一下文檔,才發現,這里其實是二進制轉換成的十進制,哈哈:

 糾錯等級編碼:

當你要填入的數據小於對應的允許值時,尺寸計算公式可以直接帶入參數計算,當你的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就可以設置為False了。

 

 我要生成的大小為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了的:

所以計算出來肯定是不會剛好合適的:

# 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生成二維碼的尺寸的個人拙見。

 附上二維碼的版本與容量表:

 

 

 

 如有需要125頁的二維碼ISO國際標准pdf文檔,可以留言發你。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM