KING_C#学习之QRCode二维码(一)——基础知识扫盲
? ? ? ? ?在移動互聯網快速發展下,二維碼的應用非常廣泛,且前景甚好。現在的登陸、分享等功能都可以利用二維碼快速便捷地把信息傳送出去,我個人是比較喜歡用這個技術,所以憑著興趣以及二維碼的強大,對二維碼的相關知識做了一些整理。
一、二維碼
1.定義:
二維碼(2-Dimensional Bar Code),是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的。它是指在一維條碼的基礎上擴展出另一維具有可讀性的條碼,使用黑白矩形圖案表示二進制數據,被設備掃描后可獲取其中所包含的信息。一維條碼的寬度記載著數據,而其長度沒有記載數據。二維條碼的長度、寬度均記載著數據。二維條碼有一維條碼沒有的“定位點”和“容錯機制”。容錯機制在即使沒有辨識到全部的條碼、或是說條碼有污損時,也可以正確地還原條碼上的信息。
2.類別:
二維條碼的種類很多,不同的機構開發出的二維條碼具有不同的結構以及編寫、讀取方法。常見的二維碼有:
- PDF417碼
- QR碼
- 漢信碼
- 顏色條碼
- quick mark code
- data matrix
一維碼
?? 一維條碼—— Code 128 僅有橫向信息
二維碼
??較為常見的二維條碼——QR碼
內容為 http://zh.wikpedia.org
橫向縱向都含有信息?
3、定位標記:
二維條碼通常有特定的定位標記(如QR碼為三個大的定位點),通過定位標記使讀碼機正確辨識進行解讀,所以二維條碼不管是從何種方向讀取都可以被辨識。
4、特性:
二維條碼比一維條碼記載數據量更多。而且可以記載更復雜的數據,比如圖片鏈接、網絡鏈接等。
二、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 的正方形。
數據和糾錯碼字:
實際保存的二維碼信息,和糾錯碼字(用于修正二維碼損壞帶來的錯誤)。
存儲
| 數字 | 最多7,089字元 |
| 字母 | 最多4,296字元 |
| 二進制數(8 bit) | 最多2,953?字節 |
| 日文漢字/片假名 | 最多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大概也就能容下十幾個字符。
容錯能力
QR碼有容錯能力,QR碼圖形如果有破損,仍然可以被機器讀取內容,最高可以到7%~30%面積破損仍可被讀取。所以QR碼可以被廣泛使用在運輸外箱上。
相對而言,容錯率愈高,QR碼圖形面積愈大。所以一般折衷使用15%容錯能力。
| L水平 | 7%的字碼可被修正 |
| M水平 | 15%的字碼可被修正 |
| Q水平 | 25%的字碼可被修正 |
| H水平 | 30%的字碼可被修正 |
編碼
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 的編碼。
3、編碼過程
簡要的編碼過程:
??? 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碼生成原理(一)
二維條碼
總結
以上是生活随笔為你收集整理的KING_C#学习之QRCode二维码(一)——基础知识扫盲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot缓存@Cacheab
- 下一篇: Python例题(一) 输入一个正整数