二維碼(QR code)基本結構及生成原理



轉發:https://blog.csdn.net/u012611878/article/details/53167009

什麼是二維碼

二維碼 (2-dimensional bar code),是用某種特定的幾何圖形按一定規律在平面(二維方向上)分佈的黑白相間的圖形記錄數據符號信息的。

在許多種類的二維條碼中,常用的碼制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。

二維條碼/二維碼可以分爲堆疊式/行排式二維條碼和矩陣式二維條碼。

1.堆疊式/行排式二維條碼,堆疊式/行排式二維條碼又稱堆積式二維條碼或層排式二維條碼,其編碼原理是建立在一維條碼基礎之上,按需要堆積成二行或多行。它在編碼設計、校驗原理、識讀方式等方面繼承了一維條碼的一些特點,識讀設備與條碼印刷與一維條碼技術兼容。但由於行數的增加,需要對行進行判定,其譯碼算法與軟件也不完全相同於一維條碼。有代表性的行排式二維條碼有:Code 16K、Code 49、PDF417、MicroPDF417 等。

2.矩陣式二維碼,最流行莫過於QR CODE ,我們常說的二維碼就是它了。矩陣式二維條碼(又稱棋盤式二維條碼)它是在一個矩形空間通過黑、白像素在矩陣中的不同分佈進行編碼。在矩陣相應元素位置上,用點(方點、圓點或其他形狀)的出現表示二進制「1」,點的不出現表示二進制的「0」,點的排列組合確定了矩陣式二維條碼所代表的意義。矩陣式二維條碼是建立在計算機圖像處理技術、組合編碼原理等基礎上的一種新型圖形符號自動識讀處理碼制。具有代表性的矩陣式二維條碼有:Code One、MaxiCode、QR Code、 Data Matrix、Han Xin Code、Grid Matrix 等。

二維碼在現實生活中的應用越來越普遍由於QR CODE的流行,二維碼又稱QR code。

QR碼的特點

1.存儲大容量信息

傳統的條形碼只能處理20位左右的信息量,與此相比,QR碼可處理條形碼的幾十倍到幾百倍的信息量。

另外,QR碼還可以支持所有類型的數據。(如:數字、英文字母、日文字母、漢字、符號、二進制、控制碼等)。一個QR碼最多可以處理7089字(僅用數字時)的巨大信息量。

2.在小空間內打印

QR碼使用縱向和橫向兩個方向處理數據,如果是相同的信息量,QR碼所佔空間爲條形碼的十分之一左右。(還支持Micro QR碼,可以在更小空間內處理數據。)

這裏寫圖片描述

3.有效表現各種字母

QR碼是日本國產的二維碼,因此非常適合處理日文字母和漢字。QR碼字集規格定義是按照日本標準「JIS第一級和第二級的漢字」制定的,因此在日語處理方面,每一個全角字母和漢字都用13比特的數據處理,效率較高,與其他二維碼相比,可以多存儲20%以上的信息。

這裏寫圖片描述

4.對變髒和破損的適應能力強

QR碼具備「糾錯功能」,即使部分編碼變髒或破損,也可以恢復數據。數據恢復以碼字爲單位(是組成內部數據的單位,在QR碼的情況下,每8比特代表1碼字),最多可以糾錯約30%(根據變髒和破損程度的不同,也存在無法恢復的情況)。

5.可以從任意方向讀取

QR碼從360°任一方向均可快速讀取。其奧祕就在於QR碼中的3處定位圖案,可以幫助QR碼不受背景樣式的影響,實現快速穩定的讀取。

這裏寫圖片描述

6.支持數據合併功能

QR碼可以將數據分割爲多個編碼,最多支持16個QR碼。使用這一功能,還可以在狹長區域內打印QR碼。另外,也可以把多個分割編碼合併爲單個數據。

這裏寫圖片描述

QR碼的信息量和版本

QR碼設有1到40的不同版本(種類),每個版本都具備固有的碼元結構(碼元數)。(碼元是指構成QR碼的方形黑白點。)

「碼元結構」是指二維碼中的碼元數。從版本1(21碼元×21碼元)開始,在縱向和橫向各自以4碼元爲單位遞增,一直到版本40(177碼元×177碼元)。

這裏寫圖片描述

QR碼的各個版本結合數據量、字符類型和糾錯級別,均設有相對應的最多輸入字符數。也就是說,如果增加數據量,則需要使用更多的碼元來組成QR碼,QR碼就會變得更大。

例如,需要輸入的數據爲100位的數字時,通過以下步驟來選定。
1.假設要輸入的數據種類爲「數字」
2.從「L」「M」「Q」「H」中選擇糾錯級別。(假設選擇「M」)
3.查看下錶,先從數字列找出數字爲100以上且接近100的,其次找出糾錯級別「M」,兩者交叉的部分就是最佳版本。

這裏寫圖片描述

通過下面的計算爲每個字符類型,總比特數的計算方法。
這裏寫圖片描述

QR碼的糾錯

QR碼具有「糾錯功能」。即使編碼變髒或破損,也可自動恢復數據。這一「糾錯能力」具備4個級別,用戶可根據使用環境選擇相應的級別。調高級別,糾錯能力也相應提高,但由於數據量會隨之增加,編碼尺寸也也會變大。
用戶應綜合考慮使用環境、編碼尺寸等因素後選擇相應的級別。 在工廠等容易沾染贓物的環境下,可以選擇級別Q或H,在不那麼髒的環境下,且數據量較多的時候,也可以選擇級別L。一般情況下用戶大多選擇級別M(15%)。
這裏寫圖片描述

糾錯級別的比率,是指全部碼字與可以糾錯的碼字的比率。
例如,需要編碼的碼字數據有100個,並且想對其中的一半,也就是50個碼字進行糾錯,則計算方法如下。糾錯需要相當於碼字2倍的符號(RS編碼※),因此在這種情況下的數量爲50個×2=100碼字。因此,全部碼字數量爲200個,其中用作糾錯的碼字爲50個,所以計算得出,相對於全部碼字的糾錯率就是25%。這一比率相當於QR碼糾錯級別中的「Q」級別。

另外,在上述例子當中,也可以認爲相對於碼字數據的糾錯率爲50%,但變髒或破損的部位不僅僅侷限於碼字數據部分,因此,在QR碼中,還是用相對於全部碼字的比率來描述糾錯率。

※ RS編碼:QR碼的糾錯功能是通過將RS編碼附加到原數據中的方式實現的。RS編碼是應用於音樂CD等用途的數學糾錯方法。它能以字節爲單位進行糾錯,適合用於錯誤位置會集中的突發錯誤。

QR碼的種類

這裏寫圖片描述

QR碼的基本結構

QR(Quick-Response) code是被廣泛使用的一種二維碼,解碼速度快。它可以存儲多用類型,下圖是qrcode的基本結構:

這裏寫圖片描述

位置探測圖形、位置探測圖形分隔符、定位圖形:用於對二維碼的定位,對每個QR碼來說,位置都是固定存在的,只是大小規格會有所差異;
校正圖形:規格確定,校正圖形的數量和位置也就確定了;
格式信息:表示改二維碼的糾錯級別,分爲L、M、Q、H;

版本信息:即二維碼的規格,QR碼符號共有40種規格的矩陣(一般爲黑白色),從21x21(版本1),到177x177(版本40),每一版本符號比前一版本 每邊增加4個模塊。

數據和糾錯碼字:實際保存的二維碼信息,和糾錯碼字(用於修正二維碼損壞帶來的錯誤)。

QR碼的編碼過程

下面是簡要QR編碼過程:

1.數據分析:確定編碼的字符類型,按相應的字符集轉換成符號字符; 選擇糾錯等級,在規格一定的條件下,糾錯等級越高其真實數據的容量越小。

2.數據編碼:將數據字符轉換爲位流,每8位一個碼字,整體構成一個數據的碼字序列。其實知道這個數據碼字序列就知道了二維碼的數據內容。

容量如下:

格式 容量
數字 最多7089字符
字母 最多4296字符
二進制數(8 bit) 最多2953字節
日文漢字/片假名 最多1817字符(採用Shift JIS)
中文漢字 最多984字符(採用UTF-8)
中文漢字 最多1800字符(採用BIG5)

模式編碼如下:

模式 指示符
ECI 0111
數字 0001
字母數字 0010
8位字節 0100
日本漢字 1000
中文漢字 1101
結構鏈接 0011
FNCI 0101(第一位置)
1001(第二位置)
終止符(信息結尾) 0000

數據可以按照一種模式進行編碼,以便進行更高效的解碼,例如:對數據:01234567編碼(版本1-H),
1)分組:012 345 67
2)轉成二進制:
012→0000001100
345→0101011001
67 →1000011
3)轉成序列:0000001100 0101011001 1000011
4)字符數 轉成二進制:8→0000001000
5)加入模式指示符(上圖數字)0001:0001 0000001000 0000001100 0101011001 1000011

對於字母、中文、日文等只是分組的方式、模式等內容有所區別。基本方法是一致的。

3.糾錯編碼:按需要將上面的碼字序列分塊,並根據糾錯等級和分塊的碼字,產生糾錯碼字,並把糾錯碼字加入到數據碼字序列後面,成爲一個新的序列。

糾錯等級 糾錯水平
L 7%字碼修正
M 15%字碼修正
Q 25%字碼修正
H 30%字碼修正

在二維碼規格和糾錯等級確定的情況下,其實它所能容納的碼字總數和糾錯碼字數也就確定了,比如:版本10,糾錯等級時H時,總共能容納346個碼字,其中224個糾錯碼字。

就是說二維碼區域中大約1/3的碼字時冗餘的。對於這224個糾錯碼字,它能夠糾正112個替代錯誤(如黑白顛倒)或者224個據讀錯誤(無法讀到或者無法譯碼),這樣糾錯容量爲:112/346=32.4%。

4.構造最終數據信息:在規格確定的條件下,將上面產生的序列按次序放如分塊中。

按規定把數據分塊,然後對每一塊進行計算,得出相應的糾錯碼字區塊,把糾錯碼字區塊 按順序構成一個序列,添加到原先的數據碼字序列後面。
如:D1, D12, D23, D35, D2, D13, D24, D36, … D11, D22, D33, D45, D34, D46, E1, E23,E45, E67, E2, E24, E46, E68,…

5.構造矩陣:將探測圖形、分隔符、定位圖形、校正圖形和碼字模塊放入矩陣中。

這裏寫圖片描述

把上面的完整序列填充到相應規格的二維碼矩陣的區域中。

6.掩摸:將掩摸圖形用於符號的編碼區域,使得二維碼圖形中的深色和淺色(黑色和白色)區域能夠比率最優的分佈。

7.格式和版本信息:生成格式和版本信息放入相應區域內。

版本7-40都包含了版本信息,沒有版本信息的全爲0。二維碼上兩個位置包含了版本信息,它們是冗餘的。

版本信息共18位,6X3的矩陣,其中6位時數據爲,如版本號8,數據位的信息時 001000,後面的12位是糾錯位。

QR碼的應用

QR碼可以很「方便」地應用於各種場合。除了傳單和名片等印刷物之外,還可以應用於各種廣泛領域,如結算系統等與生活息息相關的領域以及工廠、流通等各種商業領域。QR碼已經成爲日常生活不可或缺的工具。2012年,公益財團法人日本設計振興會對QR碼錶示了高度評價,由於QR碼的功能非常貼近生活,設計精緻,在其主辦的設計推薦制度中授予QR碼「優秀設計獎」。

QR碼的標準化

「想讓更多人使用QR碼」,秉承這一理念,DENSO WAVE全面公開了QR碼的相關標準。目前,QR碼已經在國家標準和國際標準中實現標準化,任何人都可以隨意查看該標準。

※DENSO WAVE INCORPORATED已宣佈,不行使本公司就標準QR碼擁有的專利權(專利第2938338號)。

1997年 10月 被採納爲AIM International(國際自動識別工業會)標準(ISS - QR Code)
1998年 3月 被採納爲JEIDA(日本電子工業振興協會)標準(JEIDA-55)
1999年 1月 被採納爲JIS(日本工業標準)(JIS X 0510)
2000年 6月 被採納爲ISO國際標準 (ISO/IEC18004)
2004年 11月 Micro QR碼被採納爲JIS(日本工業標準)(JIS X 0510)
2011年 12月 國際標準化組織GS1將QR碼採納爲面向移動終端的標準

QR碼的簡要標準
這裏寫圖片描述

QR碼標準文件下載

QR碼在ISO(ISO/IEC18004)中得到 標準化。因此,請從以下團體的網站購買QR碼標準文件,在下面網址中搜索18004。

http://www.iso.ch/iso/en/prods-services/ISOstore/store.html

不過2016標準版的價格略貴,可到本人的資源中下載2006標準版的,鏈接如下:

http://download.csdn.net/detail/u012611878/9687105

另外,這裏提供一個c++編寫的qrcode編碼解碼工具,基於zxing的編碼庫,libqrcode的解碼庫,通過命令行完成二維碼圖片與文本之間的相互轉換,鏈接如下:

http://download.csdn.net/detail/u012611878/9705048

歡迎下崽。