維碼圖
Position Detection Pattern
首先,先把Position Detection圖案畫在三個角上。(無論Version如何,這個圖案的尺寸就是這么大)
Alignment Pattern
然后,再把Alignment圖案畫上(無論Version如何,這個圖案的尺寸就是這么大)
關于Alignment的位置,可以查看QR Code Spec的第81頁的Table-E.1的定義表(下表是不完全表格)
下圖是根據上述表格中的Version8的一個例子(6,24,42)
Timing Pattern
接下來是Timing Pattern的線(這個不用多說了)
Format Information
再接下來是Formation Information,下圖中的藍色部分。
Format Information是一個15個bits的信息,每一個bit的位置如下圖所示:(注意圖中的Dark Module,那是永遠出現的)
這15個bits中包括:
5個數據bits:其中,2個bits用于表示使用什么樣的Error Correction Level, 3個bits表示使用什么樣的Mask
10個糾錯bits。主要通過BCH Code來計算
然后15個bits還要與101010000010010做XOR操作。這樣就保證不會因為我們選用了00的糾錯級別和000的Mask,從而造成全部為白色,這會增加我們的掃描器的圖像識別的困難。
下面是一個示例:
關于Error Correction Level如下表所示:
關于Mask圖案如后面的Table 23所示。
Version Information
再接下來是Version Information(版本7以后需要這個編碼),下圖中的藍色部分。
Version Information一共是18個bits,其中包括6個bits的版本號以及12個bits的糾錯碼,下面是一個示例:
而其填充位置如下:
數據和數據糾錯碼
然后是填接我們的最終編碼,最終編碼的填充方式如下:從左下角開始沿著紅線填我們的各個bits,1是黑色,0是白色。如果遇到了上面的非數據區,則繞開或跳過。
掩碼圖案
這樣下來,我們的圖就填好了,但是,也許那些點并不均衡,如果出現大面積的空白或黑塊,會告訴我們掃描識別的困難。所以,我們還要做Masking操作(靠,還嫌不復雜)QR的Spec中說了,QR有8個Mask你可以使用,如下所示:其中,各個mask的公式在各個圖下面。所謂mask,說白了,就是和上面生成的圖做XOR操作。Mask只會和數據區進行XOR,不會影響功能區。(注:選擇一個合適的Mask也是有算法的)
其Mask的標識碼如下所示:(其中的i,j分別對應于上圖的x,y)
下面是Mask后的一些樣子,我們可以看到被某些Mask XOR了的數據變得比較零散了。
Mask過后的二維碼就成最終的圖了。
好了,大家可以去嘗試去寫一下QR的編碼程序,當然,你可以用網上找個Reed Soloman的糾錯算法的庫,或是看看別人的源代碼是怎么實現這個繁鎖的編碼。