如何製作 QR Code #1:基本介紹

帶你實現屬於自己的 QR Code 產生器和解碼器

Yeecy
6 min readAug 21, 2020

本文著重於介紹 QR Code 的各個組成部分(如版本、容錯等級),並補充一些自己的心得,主要為規範名詞使用,並不會涵蓋 QR Code 的歷史或應用方式等在網路上唾手可得的資訊。

對 QR Code 之技術細節有興趣者,請點擊下方連結以取得更多深入的資訊,Yeecy 相信讀者能從中可以得到滿意的說明。

點此閱讀《如何製作 QR Code》其他文章

首先,簡略提一下 QR Code 的產生和解碼流程,相關名詞會在下方 QR Code 的組成中解釋,並附有英文對照。

流程中的超連結會轉跳到相關文章,有需要的讀者可以善加利用。

QR Code 的產生流程

  1. 輸入原始訊息
  2. 選擇編碼模式
  3. 根據編碼模式與容錯等級,選擇使用的版本
  4. 使用原始訊息、編碼模式和版本,生成編碼後訊息
  5. 按照版本與容錯等級,產生編碼後訊息的錯誤校正碼
  6. 進行一些步驟,產生含 4. 和 5. 的最終訊息
  7. 根據版本,放置功能圖案
  8. 根據版本,增加版本資訊
  9. 根據容錯等級和遮罩,添加格式資訊
  10. 使用之字形排放 6. 的最終訊息
  11. 套用資料遮罩
  12. 根據規則挑選最優遮罩
  13. 添加靜默區域
  14. 完成圖片生成

QR Code 的解碼流程

  1. 讀取圖片,若圖片本身為 QR Code 產生器產生的圖片,則跳至 5.
  2. 辨識 QR Code 位於圖片中的位置
  3. 使用透視變換提取出 QR Code
  4. 重新採樣 QR Code
  5. 去除靜默區域
  6. 將原圖縮小至最小可能的尺寸
  7. 讀取格式資訊
  8. 修復格式資訊
  9. 由格式資訊獲得容錯等級和遮罩
  10. 讀取版本資訊
  11. 修復版本資訊
  12. 配合版本資訊確定版本
  13. 使用之字形讀取編碼區域
  14. 利用錯誤校正碼修正編碼後資料
  15. 讀取編碼模式和其他解碼必要訊息
  16. 解碼資料
  17. 獲得原始訊息

QR Code 的組成

碼元(module)

組成 QR Code 的基本單位是碼元,為正方形的黑白格子,其中黑色的格子表示數字 1,而白色的格子表示數字 0。

版本(version)

QR Code 一共有 40 個版本,最小的版本 1 可以乘載 21×21 = 441 個碼元,每多一個版本,其邊長各會增加 4 個碼元,由此我們不難算出版本 40 總共包含 177×177 = 31329 個碼元。

版本 29 的 QR Code,每邊有 133 個碼元,編碼內容取自日文維基百科 QRコード 條目

定位圖案(position pattern)

定位圖案可說是 QR Code 最令人印象深刻的特徵,每個 QR Code 上必定會有 3 個回字形的定位圖案,每個圖案都有著 1 : 1 : 3 : 1 : 1(黑:白:黑:白:黑)個碼元,是辨識 QR Code 時最重要的圖案。

版本 1 QR Code 的 3 個定位圖案

分隔圖案(separator pattern)

分隔圖案簡單來說,就是位在定位圖案旁邊的連續白色碼元,為定位圖案的護城河,使定位圖案能與其他圖案分隔出來。

定位圖案旁新增的白色碼元即是分隔圖案

黑色碼元(dark module)

所有版本 QR Code 中都有,位於下方分隔圖案旁邊的黑色碼元,小小一個很可愛,但跟盲腸一樣沒有什麼用處,就只是佔個位子而已。

版本 1 QR Code 中的黑色碼元

對齊圖案(alignment pattern)

除了版本 1 的 QR Code 外,其餘版本都需要加上對齊圖案,對齊圖案的個數依版本會有所不同,但樣式是確定的,每個對齊圖案皆有 1 : 1 : 1 : 1 : 1(黑:白:黑:白:黑)的碼元。

至於為何需要對齊圖案呢?我的猜想是當圖片中的 QR Code 並非處於一個平面(如寶特瓶的表面)時,對齊圖案可以用來作為修正 QR Code 形變的參考。

版本 9 QR Code 中的 6 個對齊圖案

定時圖案(timing pattern)

定時圖案是所有版本 QR Code 都有,由一連串黑白相間的碼元所形成的直線,共兩條。

事實上我不確定這圖案的用處,我只想到兩種需要它的理由,一是因為定時圖案的變化是規律的,所以能用來確定一個碼元所佔的像素大小,二是可以用來定位版本資訊,理由下方會提到。

版本 7 QR Code 中,黑白相間的直線即為定時圖案

版本資訊(version information)

在版本 7 以上的 QR Code,需要在兩個位置放上長 18 碼元,以長方形放置的版本資訊,詳細內容請閱讀《如何製作 QR Code #7》

由於版本資訊位於 QR Code 的邊緣到定時圖案之間,所以我才會在前面提到定時圖案可以用來定位版本資訊。

版本 7 QR Code 的版本資訊

容錯等級(error correction level)

在 QR Code 中一共有 4 種容錯等級 L、M、Q 和 H,分別對應 4 種不同的容錯能力 7%、15%、25% 和 30%,當然,這些都是理論的最大值。

我們之所以會看到有些人在 QR Code 上增加自己的圖案,卻不會導致無法讀取的原因,正是因為 QR Code 能夠容忍錯誤發生。不過隨著容錯等級的增加,在相同版本下我們能儲存的資訊就會相對變少。

格式資訊 (format information)

所有版本的 QR Code 都需要加入格式資訊,格式資訊包含容錯等級和遮罩樣式,長 15 個碼元,共放置兩份在 QR Code 上,請閱讀《如何製作 QR Code #8》以取得更多說明。

版本 1 QR Code 的格式資訊

結語

以上為 QR Code 各個組成部分的解說,通常我們把前述圖案(不含版本和格式資訊)統稱為功能圖案(function patterns),而剩下的版本資訊、格式資訊和尚未填入碼元的區域統稱為編碼區域(encoding region)。

版本 2 QR Code,包含格式資訊和所有功能圖案

下一篇文章將會探討 QR Code 標準中的四種基本編碼模式:Numeric、Alphanumeric、Byte 和 Kanji。

感謝你的閱讀,我是 Yeecy,我們下次見。

--

--

Yeecy

"What I cannot create, I do not understand. Know how to solve every problem that has been solved." - Richard Feynman