二維碼(QR code)基本知識


1.二維碼定義:

  二維碼(2-Dimensional Bar Code),是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的。它是指在一維條碼的基礎上擴展出另一維具有可讀性的條碼,使用黑白矩形圖案表示二進制數據,被設備掃描后可獲取其中所包含的信息。一維條碼的寬度記載着數據,而其長度沒有記載數據。二維條碼的長度、寬度均記載着數據。二維條碼有一維條碼沒有的“定位點”和“容錯機制”。容錯機制在即使沒有辨識到全部的條碼、或是說條碼有污損時,也可以正確地還原條碼上的信息。

2.類別:

  二維條碼的種類很多,不同的機構開發出的二維條碼具有不同的結構以及編寫、讀取方法。常見的二維碼有:PDF417碼、QR碼、漢信碼、顏色條碼、quick mark code、data matrix

一維碼                        二維碼

              

  一維條碼——Code 128              較為常見的二維條碼——QR碼

    僅有橫向信息                     橫行縱向都包含信息

3.定位標記

  二維條碼通常有特定的定位標記(如QR碼為三個大的定位點),通過定位標記使讀碼機正確辨識進行解讀,所以二維條碼不管是從何種方向讀取都可以被辨識。

4.特性

  二維條碼比一維條碼記載數據量更多。而且可以記載更復雜的數據,比如圖片鏈接、網絡鏈接等。

5.QR碼

  QR碼(全稱為快速響應矩陣碼;英語:Quick Response Code)是二維條碼的一種,於1994年由日本DENSO WAVE公司發明。QR來自英文Quick Response的縮寫,即快速反應,因為發明者希望QR碼可以讓其內容快速被解碼。QR碼使用四種標准化編碼模式(數字,字母數字,字節(二進制)和漢字)來存儲數據。QR碼最常見於日本,為目前日本最流行的二維空間條碼。QR碼比較普通條碼可以存儲更多數據,也無需要像普通條碼般在掃描時需要直線對准掃描儀。因此其應用范圍已經擴展到包括產品跟蹤,物品識別,文檔管理,營銷等方面。

  (1)簡介

    QR碼呈正方形,常見的是黑白兩色。在3個角落,印有較小,像“回”字的正方圖案。這3個是幫助解碼軟件定位的圖案,用戶不需要對准,無論以任何角度掃描,數據仍然可以正確被讀取。
    日本QR碼的標准JIS X 0510在1999年1月發布,而其對應的ISO國際標准ISO/IEC18004,則在2000年6月獲得批准。根據Denso Wave公司的網站數據,QR碼是屬於開放式的標准,QR碼的規格公開,雖由Denso Wave公司持有的專利權益,但不會被運行。
除了標准的QR碼之外,也存在一種稱為“微型QR碼”的格式,是QR碼標准的縮小版本,主要是為了無法處理較大型掃描的應用而設計。微型QR碼同樣有多種標准,最高可存儲35個字元。

  (2)技術特征

       

    如上圖時一個qrcode的基本結構,其中:
    位置探測圖形、位置探測圖形分隔符、定位圖形:
    用於對二維碼的定位,對每個QR碼來說,位置都是固定存在的,只是大小規格會有所差異;
    校正圖形:規格確定,校正圖形的數量和位置也就確定了;
    格式信息:表示改二維碼的糾錯級別,分為L、M、Q、H;
    版本信息:即二維碼的規格,QR碼符號共有40種規格的矩陣(一般為黑白色),從21x21(版本1),到177x177(版本40),每一版本符號比前一版本 每邊增加4個模塊。
    二維碼一共有 40 個尺寸。官方叫版本 Version。Version 1 是 21 x 21 的矩陣,Version 2 是 25 x 25 的矩陣,Version 3 是 29 的尺寸,每增加一個 version,就會增加 4 的尺寸,公式是:(V-1)*4 + 21(V是版本號) 最高 Version 40,(40-1)*4+21 = 177,所以最高是 177 x 177 的正方形。
    數據和糾錯碼字:實際保存的二維碼信息,和糾錯碼字(用於修正二維碼損壞帶來的錯誤)。

  (3)存儲

    Qr碼一共提供40種不同版本存儲密度的結構,對應指示圖的“版本信息”,版本1為21*21像素,每升一個版本長寬各增加4像素,最大的版本40為177*177像素。

QR碼最大數據容量(對於版本40)
數字 最多7089字元
字母 最多4296字元
二進制數(8bit) 最多2953字節
日文漢子/片假名 最多1,817字元(采用Shift JIS)
中文漢子 最多984字元(采用UTF-8)
  最多1,800字元(采用BIG5/GB2312)提供40種不同版本存儲密度的結構,對應指示圖的“版本信息”,版本1為21×21像素,每機一級長寬各增加4像素,最大的版本40為177×177像素。

    對於不同版本的二維碼,容量也是不同的。理論上內容經過壓縮處理后可以存7089個數字,4296 個字母和數字混合字符,2953個8位字節數據,1817個漢字;在上面我們看到,不同的Version的QR Code是不同的矩陣,Version版本越過,也就意味着容量越大。關於容量的計算我沒有找到比較權威的算法,這里以第一版的來進行計算,第一版(21×21)的格式如下:

              

    其中的只有黃色的是存儲數據的內容,在第一版本中只有217(21×21 - 8*9*3 -8)個存儲數據的數空間,而其中有用的數據是 217 - 1個數據結尾標志 = 216 ,在216bit
    216bit/8 = 27Byte 在版本一的QR碼中只能夠存儲27Byte的數據(要是有校驗容錯就更少了),當然在不同的容錯級別下,容量也是有變化的。
    所以,version為1的QR Code大概也就能容下十幾個字符。

  (4)容錯能力

    QR碼有容錯能力,QR碼圖形如果有破損,仍然可以被機器讀取內容,最高可以到7%~30%面積破損仍可被讀取。所以QR碼可以被廣泛使用在運輸外箱上。
    相對而言,容錯率愈高,QR碼圖形面積愈大。所以一般折衷使用15%容錯能力。

錯誤修正容量
L水平 7%的字碼可被修正
M水平 15%的字碼可被修正
Q水平 25%的字碼可被修正
H水平 30%的字碼可被修正

   (5)編碼

    QR 碼支持如下的編碼:
    Numeric mode 數字編碼,從 0 到9。如果需要編碼的數字的個數不是 3 的倍數,那么,最后剩下的 1 或 2 位數會被轉成 4 或 7bits,則其它的每 3 位數字會被編成 10,12,14bits,編成多長還要看二維碼的尺寸(下面有一個表 Table 3 說明了這點)
    Alphanumeric mode 字符編碼。包括 0-9,大寫的A到Z(沒有小寫),以及符號$ % * + – . / : 包括空格。這些字符會映射成一個字符索引表。如下所示:(其中的 SP 是空格,Char 是字符,Value 是其索引值) 編碼的過程是把字符兩兩分組,然后轉成下表的 45 進制,然后轉成 11bits 的二進制,如果最后有一個落單的,那就轉成 6bits 的二進制。而編碼模式和字符的個數需要根據不同的 Version 尺寸編成9, 11 或 13 個二進制(如下表中 Table 3)

                         

    Byte mode, 字節編碼,可以是0-255 的 ISO-8859-1 字符。有些二維碼的掃描器可以自動檢測是否是 UTF-8 的編碼。

6.編碼過程

    簡要的編碼過程:
    1. 數據分析:確定編碼的字符類型,按相應的字符集轉換成符號字符; 選擇糾錯等級,在規格一定的條件下,糾錯等級越高其真實數據的容量越小。
    2. 數據編碼:將數據字符轉換為位流,每8位一個碼字,整體構成一個數據的碼字序列。其實知道這個數據碼字序列就知道了二維碼的數據內容。

                     

    數據可以按照一種模式進行編碼,以便進行更高效的解碼,例如:對數據: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.糾錯編碼

    按需要將上面的碼字序列分塊,並根據糾錯等級和分塊的碼字,產生糾錯碼字,並把糾錯碼字加入到數據碼字序列后面,成為一個新的序列。
    在二維碼規格和糾錯等級確定的情況下,其實它所能容納的碼字總數和糾錯碼字數也就確定了,比如:版本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碼生成原理(一)
  二維條碼

 

 

出處:https://www.cnblogs.com/relices/p/QRCode.html

=======================================================================================

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

什么是二維碼

二維碼 (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

歡迎下崽。

 

出處:https://blog.csdn.net/u012611878/article/details/53167009


免責聲明!

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



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