相同資料,QR Code 圖案為何不同?8 種遮罩與懲罰分數解析
EENTERTAINMENT
娛樂發布: 9 分鐘閱讀

相同資料,QR Code 圖案為何不同?8 種遮罩與懲罰分數解析

把同一個網址輸入不同的 QR Code 產生器,得到的黑白圖案可能不一樣。光憑外觀差異,不能判定其中一個有問題;應先解碼,再比對內容。除了錯誤更正等級、尺寸與編碼方式,遮罩圖案也是影響外觀的因素。

本文討論常見的正方形 QR Code Model 2,不能把這裡的 8 種遮罩與評分方法直接套用到 Micro QR 或 rMQR。延續QR Code 錯誤更正等級的介紹,接下來說明遮罩改變了什麼,又有哪些事情無法靠遮罩解決。

日文原文發布: 2026-06-06

QR Code 圖案不只取決於資料本身

QR Code 由資料碼字、錯誤更正碼字,以及定位、時序、校正等功能圖案組成。若只把位元直接放上去,可能出現大面積同色區塊、過長的同色連續區段,或類似定位圖案的排列。

構成圖案的小方格稱為模組(module)。遮罩依條件反轉資料碼字、錯誤更正碼字與尾端剩餘位元(remainder bits)所在區域的部分模組:黑變白,白變黑。反轉條件不同,即使碼字相同,外觀也會改變。遮罩不會增加資料容量,也不會增加錯誤更正所用的冗餘資訊。

對同一批方格反轉兩次,就會回到原來的值。格式資訊會記錄使用的遮罩編號,讀取端因此能解除遮罩、還原碼字。這不是隨機裝飾,也不是加密。

8 種遮罩:先確認從零開始的座標

座標不包含四周留白區。符號左上角的模組是 (r, c) = (0, 0);r 表示列,往下增加,c 表示欄,往右增加。mod 表示非負整數的餘數,floor 表示向下取整。符合條件且屬於遮罩適用區域的模組才會反轉;功能圖案與格式資訊不受這 8 種資料遮罩反轉。

表格若超出畫面寬度,可左右捲動。

遮罩編號反轉條件
0(r + c) mod 2 = 0
1r mod 2 = 0
2c mod 3 = 0
3(r + c) mod 3 = 0
4(floor(r / 2) + floor(c / 3)) mod 2 = 0
5((r × c) mod 2 + (r × c) mod 3) = 0
6(((r × c) mod 2 + (r × c) mod 3) mod 2) = 0
7(((r + c) mod 2 + (r × c) mod 3) mod 2) = 0

自動選擇時,產生器會評估全部 8 個候選圖案,再選出懲罰分數最低的結果。有些函式庫也允許手動指定遮罩,但那不等於經過自動評分選出的結果。只要正確套用於相同碼字,不同遮罩仍會解碼出相同內容。

先寫入候選遮罩的格式資訊,再評分

編碼時,先決定數字、英數字或位元組等模式與版本,建立資料及錯誤更正碼字,並配置功能圖案與碼字。在 Nayuki 的公開實作中,接著依下列順序評估遮罩:

  1. 套用一個候選遮罩。
  2. 寫入這個候選遮罩對應的格式資訊。
  3. 對整個符號評分,包含功能圖案。
  4. 還原這次遮罩造成的反轉,繼續比較其他候選。
  5. 套用選出的遮罩,寫入最終格式資訊。

反轉的範圍與評分的範圍並不相同。計算黑色模組比例時,不把符號外側留白加入模組總數。讀取端從格式資訊取得遮罩編號,不需要重做一次評分競賽。

即使網址一樣,錯誤更正等級、版本、分段與編碼方式也可能讓遮罩套用前的排列不同。實作細節還可能影響候選分數。因此,外觀不同本身不能證明是偽造圖案,也不能證明內容不同。

N1:同色模組連續排列

同色連續區段的長度 L≥5 時,加上 3 + (L − 5) 分。橫向各列與直向各欄都要檢查,白色連續區段也算。5 個模組是 3 分,6 個是 4 分,7 個是 5 分;不是每湊滿 5 個就重新分組計算。

11111   → 3 分
111111  → 4 分
0000000 → 5 分

這裡 1 代表黑色,0 代表白色。以上是局部範例,不是整個 QR Code 的總分。

N2:同色 2×2 區塊,重疊也要計算

每個同色 2×2 區塊加 3 分,重疊區塊也算。同色 3×3 正方形內有 4 個 2×2 區塊,因此光是 N2 就得到 12 分。同色 a×b 長方形內有 (a−1)(b−1) 個這類區塊。

N2 與 N1 分開計分,最後相加。同一區域同時符合多項規則,不是誤把分數重複計入。

N3:類似定位圖案的排列

這項規則檢查列與欄中黑、白、黑、白、黑的連續長度比 1:1:3:1:1,也考慮周圍白色空間。基本寬度為 1 個模組時,範例是 00001011101 或 10111010000;每次符合條件的偵測加 40 分。只看中間的 1011101、不管周圍情況就計分,並不完整。

這些短範例不是完整的 N3 實作。Nayuki 也處理等比例放大的連續長度,以及符號邊界的白色空間;ZXing 的 MaskUtil 則檢查 7 個模組的核心排列與相鄰 4 個白色模組。若周圍、邊界與重疊偵測的處理方式不同,就不能預期兩個函式庫一定算出相同分數。

N4:黑色模組比例與總分

在 ZXing 的實作中,D 是黑色模組數,T 是不含外側留白的模組總數,分數為 10 × floor(abs(20D − 10T) / T);abs 表示絕對值。21×21 符號的 T=441:D=220 時為 0 分,D=250 時為 10 分,D=280 時為 20 分。不要先把比例四捨五入成整數百分比再計算。

選擇遮罩時看的是 N1~N4 的總和,不是只讓黑白比例接近 50%。由於邊長是奇數,黑白模組數不可能完全各占一半。

遮罩不會改變資料量或錯誤更正的冗餘量,白色較多也不代表資料比較稀疏。分數是比較圖案的指標,不是在特定印刷、照明或相機條件下實測的掃描成功率。

遮罩解決不了的事:標誌、留白與印刷

Model 2 符號四邊都要保留至少 4 個模組寬的留白區(quiet zone)。對比不足、邊界模糊、印得太小,或標誌遮住功能圖案,不能只靠換一種遮罩補救。

錯誤更正等級 H 的約 30%,不是允許標誌遮住圖片 30% 面積的意思。Reed–Solomon 碼處理的是碼字錯誤,不能把大約可修復的比例當成安全遮蓋面積。格式資訊另有錯誤保護,但定位圖案、留白或對比受損時,可能連辨識與讀取都無法完成,還來不及利用資料的錯誤更正能力。

請用多個裝置解碼實際輸出的 QR Code,並比對還原文字。如果最後要印刷,還要確認成品尺寸、紙張與照明,不能只看螢幕預覽。模組小到相機無法分辨邊界時,再低的懲罰分數也無法保證讀取成功。

如何讀懂示意圖與查核來源

本文圖版左側的 QR Code 確實編入 https://nandemo-tools.com/。右側 8 個小格子則是遮罩條件的示意,並不是可掃描的 QR Code。示意格中的黑色代表「這個座標符合反轉條件」,不代表最終 QR Code 的這一格一定是黑色。把實際編碼與條件示意分開,才能避免讀者把裝飾格子誤認為真實資料。

ISO 目錄將 2015 年版列為已撤銷,後繼版本是 2024 年版。本文依公開文件與實作解說,不是依完整標準進行的符合性稽核。計算範例用來說明文中指定的規則與實作,不能取代完整的編碼規格。技術圖版同樣會傳達規則,因此也需要驗證,而不只是看起來像 QR Code 就好。

參考資料與來源

編輯說明

本文使用 AI 協助編輯,並於發布前由編輯確認。內容仍可能包含事實、解讀或時效上的錯誤;進行重要判斷前,請查閱所列的一手資料或官方文件。

相關文章