目前最常用的QR碼是由日本汽車公司Denso Wave的 Hara于1994年發(fā)明的。這種QR碼被命名為Quick code,縮寫為qr碼。
因為我們只是大概了解一下原理,所以不涉及手工計算二維碼。 畢竟第一步屏蔽需要進行大量的異或運算,這對于人類手工計算來說是相當困難的。
更具體的內容可以查看iso 18004文件
二維碼的結構
三個顯眼的大方塊稱為尋象圖形。 事實上,一些二維碼還可能隱藏著小方塊(最小的二維碼中沒有),稱為校正圖形。 另外,內緣有黑白線連接相鄰的兩個取景圖形,稱為定位圖形。 最后,三個取景圖(左上取景圖兩側各一行,右上取景圖下側,右上取景圖右側各一行)旁邊會有一些格式信息。左下尋像圖):
二維碼解碼-.jpg
剩余的淺綠色區(qū)域適合存儲數據和糾錯碼。
值得一提的是,對于較大的二維碼,即校正圖案有6個及以上時,右上圖搜索圖案左邊三行和左下圖上方三行會有版本信息搜索模式。 事物,破譯時也應避開這些地點:
二維碼解碼-.jpg
二維碼的信息量和版本
QR 碼有 40 個版本。 版本號越大,可以容納的數據量越大。
版本 1 至 40 在水平和垂直方向上以 4 為增量。
最小版本尺寸為21x21
最大版本大小為
最大的二維碼,使用最小的糾錯碼,可以存儲7089個數字和1819個漢字。
因此,對于普通的二維碼來說,往往保存一篇文章是不夠的,所以會存儲一些簡單的配置信息或者URL。
如果用來存儲二進制文件二維碼解碼器,它只能存儲3kb左右的大小,所以用它來存儲圖像或音頻是不現實的。
使用二維碼傳輸文件并不實用。 3kb太小了,不足以寫一篇文章。 也許結合其他壓縮算法,比如zip,可以增加存儲內容……
二維碼解碼-.png
稍微在中間
二維碼解碼-.png
二維碼解碼過程
二維碼解碼-.png
0. 尋像圖形
三個角的三個方形取像圖案是一個特殊的設計。 一方面,它們與其他常見模式不同,以防止誤讀。 取像圖案的另外三個方塊剛好可以確定二維碼的矩形邊界和起始位置(保留一角)
這三個圖形的長、寬、大小都是固定的。
1.格式信息( )
格式信息位于第一個角,位于尋像方塊的兩側,共15位。
二維碼解碼-.png
右側和下方的另外兩個尋像方塊是作為備份的重復信息。
這 15 位包括:
? 5 個數據位:2 位用于指示使用何種Error Level,3 位用于指示使用何種Mask。
? 10個糾錯位。主要通過BCH Code計算
2.摘下面罩
一般情況下,二維碼是無法直接讀取的。 他們通常都戴著面具。
因為未屏蔽的二維碼可能存在大量連續(xù)的白塊或連續(xù)的黑塊,不利于機器識別。 (尋像塊更容易識別)
使用遮蔽后,可以打亂黑白塊的分布,使二維碼更容易識別。
掩模圖案共有以下 8 種。 編碼時,算法將計算哪個掩碼產生更合適的分布并選擇它。
二維碼解碼-mask-.png
在步驟1中二維碼解碼器,我們從格式信息中找到所使用的掩碼的編號。
那么我們只需要使用對應的掩碼對數據區(qū)進行異或運算即可,非數據區(qū)不會發(fā)生變化。
如果摘下口罩后使用“掃一掃”掃描二維碼,會發(fā)現無法掃描出來。
3.確定編碼方式和大小
二維碼中黑色為1,白色為0
二維碼的讀取從右下角(沒有圖像搜索圖案的角)開始,以 Z 形圖案向上讀取。
前4位是編碼方式,后面8位是編碼長度。
編碼長度的位數與QR碼的大小有關。 當QR碼達到一定大小時,編碼長度也會有所不同,比如變成16位……
二維碼解碼-長度和編碼方式-.jpg
總共有以下幾種模式。
二維碼解碼-編碼方式-.png
不同模式有不同容量
二維碼解碼-不同編碼方式的能力-.png
4.開始解碼
總之,按照下圖,跳過中間的小方塊和格式信息等非數據區(qū)域。
二維碼解碼-解碼路線-.png
根據上一步確定的不同編碼方式進行分析。
5. 糾錯碼
QR碼中共有4個級別(Error Code Level)的糾錯碼。
糾錯能力
L級
7%的字符可以被糾正
M級
15%的字符可以修正
Q等級
25%的字符可以被糾正
H級
30%的字符可以修正
QR碼的糾錯碼采用Reed-糾錯算法。
即rar壓縮添加冗余校驗信息似乎就是這種算法。
讀取數據時,可以利用這些冗余代碼進行驗證。
因此,即使二維碼部分損壞,仍然可以正確讀取。
另外,如果用手擋住中間部分,可能不會影響閱讀,因為閱讀順序是從右下角開始的。 如果數據量不大的話,可能會在右邊讀取......