藝術 QR Code 為什麼還能掃:半色調的思路
藝術 QR Code 之所以還能掃,是因為有些解碼器並不會把每個模組當作整體來判斷。開源解碼器 ZXing 就是在每個模組計算出的中心點讀取一個畫素。Chu 等人在 2013 年提出的半色調方法正是基於這一點:每個模組的中心保留一個顏色正確的點,圖片從它周圍透出來。一旦模糊或覆蓋物碰到了中心,這個技巧就會失效,所以每個設計都需要解碼測試和印刷樣張。
事實核查於 2026 年 10 月 17 日。
掃描器看哪裡,跳過哪裡
下面的結構出自 ISO/IEC 18004 的 2006 年版;第四版於 2024 年 8 月釋出,我們沒有讀過它的全文。QR Code 有三個相同的定點陣圖形,由深色 7×7、淺色 5×5 和深色 3×3 模組組成,比例為 1:1:3:1:1;找到這三個圖形,識別器就知道碼在哪裡、旋轉了多少。之後,定時圖形和校正圖形幫助它確定模組網格的位置。
網格確定後,解碼器對每個模組取樣。一篇 2022 年的 EUSIPCO 論文以「只對每個模組的中心畫素取樣」為前提,但補充說,如果取樣網格的估計有誤差,附近的畫素也可能被取到。我們沒有核實 iPhone 和安卓手機自帶相機是怎麼解碼的,所以請把 ZXing 當作一個例子,而不是所有手機的情況。
半色調的思路
Chu、Chang、Lee 和 Mitra 於 2013 年 11 月在《ACM Transactions on Graphics》上發表了《Halftone QR Codes》。論文的模型把每個模組分成 3×3 個子模組,把模組的顏色繫結在中心那一個上,其餘八個可以自由地跟隨半色調影像。他們指出,在理想條件下,只要中心顏色正確,任何圖案都應該能讓模組被讀出。他們只改動資料模組。
可以把它理解為對每個模組的承諾:中心永遠是對的,其餘部分可以顯示圖片。如果解碼器恰好取中心,圖片就不會破壞任何碼字,糾錯能力就留作後備(這是我們的理解,不是論文的說法)。實際取樣並不完美,後備就是在這裡被用掉的。作者還介紹了一個可選步驟,在他們的測試中會有意用掉最多一半的糾錯容量。
論文坦率地說明了代價:它把下采樣造成的模糊列為侷限,因為承載資料的中心畫素很容易被相鄰畫素汙染。在一項針對五個碼、三名使用者和四款手機條碼識別應用的測試中,半色調碼在高斯模糊半徑 2 畫素、視角 40 度時就失效了;對應的普通碼要到 6 畫素和 60 度才失效。同一篇論文報告,用預設設定生成的 100 個碼中,有 91 個能被全部四款識別應用讀出。測試用的是一部 800 萬畫素的手機和顯示器上顯示的碼,所以請把結果當作方向,而不是對今天手機的預測。
藝術碼會壞在哪裡
每一行要麼破壞了「只取中心」的假設,要麼用掉了糾錯容量。最後一列標出了哪些是我們自己的推理。
| 你做了什麼 | 出了什麼問題 | 依據 |
|---|---|---|
| 在深色背景上放淺色模組 | 2006 年版允許深底淺碼,但是否嘗試反色影像由各個解碼器自己決定。ZXing 只有在呼叫方設定提示引數時才會嘗試;jsQR 預設兩種都試,速度約降低 50%。 | 標準、兩個解碼器;未核實手機相機 |
| 在三個角的圖形上作畫 | 它們負責定位和確定方向,而 Chu 等人只改動資料模組。 | 2006 年版;Chu 等人 |
| 邊距不足四個模組 | 2006 年版要求四個模組寬的靜區。DENSO WAVE 說,碼周圍有文字或圖片就無法保證所需的邊距。 | 2006 年版;DENSO WAVE |
| 縮小中心點以露出更多圖片 | 當取樣網格略有偏差時餘量更小;在 2013 年的測試中,半色調碼能承受的模糊和角度也更小。 | EUSIPCO 2022;Chu 等人;與點大小的關聯是我們的推論 |
| 用圖片的顏色給點著色 | 深淺差距可能變小。ZXing 的二值化器會把最亮和最暗畫素相差不超過 24 級(0 到 255 的刻度)的 8×8 畫素塊視為只含淺色或只含深色畫素,並改用另一種方式估算閾值。 | ZXing 原始碼;與著色的關聯是我們的推論 |
為什麼「30% 糾錯」不等於 30% 的面積
2006 年版給出 L、M、Q、H 四級的大致恢復能力分別為 7%、15%、25% 和 30%,計算的是碼字所佔的比例。DENSO WAVE 同樣用佔總碼字的比例來表示糾錯率。標準還說,翻轉一個模組會讓它所在的字元被解碼成一個看似有效、實則不同的碼字,修復它需要兩個糾錯碼字。它舉的例子是:版本 6-H 的碼有 172 個碼字,其中 112 個用於糾錯,可以修復 56 個誤碼,即容量的 32.6%。
所以任何面積百分比都只是猜測。按我們對標準中位排布圖的理解,規則碼中一個碼字佔據兩列寬、四行高的區域,因此據我們推斷,零散的小斑點可能比同樣面積的一整塊碰到更多碼字。我們不對一個設計可以覆蓋多少面積作任何斷言。如何選擇糾錯級別,請看糾錯級別詳解;成品示例請看按行業劃分的設計思路。
印刷前怎樣檢查藝術碼
- 從 H 級糾錯和儘可能短的內容開始。 在相同印刷尺寸下,內容越長模組越小,而 DENSO WAVE 說模組越大越穩定、越容易讀取。資料容量指南展示了碼會長得多快。
- 檢查每一處的深淺對比。 把設計轉成灰度。不論在圖片的亮部還是暗部,每個深色點都應當明顯比它旁邊的淺色點更深。
- 以多種尺寸做數字解碼。 免費的可掃性檢查在你的瀏覽器裡執行,不上傳圖片,會測試對比度和靜區,在縮小的尺寸下複測,並標出只有反色後才能解碼的碼。
- 列印樣張,用不同手機掃描。 標準的資料性附錄要求在最終的標籤或包裝形態下驗證碼,因為「覆蓋層、透印以及彎曲或不規則的表面都會影響碼的可讀性」。Chu 等人看到同一部手機上的四款條碼識別應用表現各不相同,所以至少用兩部手機,在實際距離和光線下測試。最小寬度請看印刷尺寸指南。
- 如果失敗,每次只改一處。 放大中心點、降低圖片對比度、印大一些或刪減內容,然後重複第 3 和第 4 步。
內建檢查能告訴你什麼,不能告訴你什麼
在 QR Maker AI 編輯器中,節日主題和像「福」字這樣的圖案半色調是免費的;截至 2026 年 10 月,圖片融合(把你自己的圖片放在點下面)是 Pro 功能(見價格方案)。對於圖案半色調和圖片融合,編輯器在每個模組只畫一箇中心點,在定點陣圖形、校正圖形和 logo 區域下面鋪一塊實心淺色底,並把糾錯級別設為 H。
編輯器的 Scan Guard 檢查會在你的瀏覽器裡,以正常尺寸和幾個更小的尺寸解碼渲染出的碼,使用的是一個開源解碼器,且只按淺底深碼的模式解碼。它無法測試深底淺碼、紙張、油墨、彎曲表面或任何手機的相機,所以第 4 步的印刷樣張不能省。可以在編輯器裡試試設計。
常見問題
藝術 QR Code 是怎麼工作的?
半色調風格的碼在每個模組的中心保留一個顏色正確的點,並在它周圍畫出圖片,因為像 ZXing 這樣的解碼器只在模組中心附近取樣。糾錯能力則是額外的安全餘量。
在 QR Code 後面放一張照片,還能掃嗎?
如果各個點仍明顯比周圍更深或更淺、三個角和邊距保持乾淨、糾錯級別為 H,就可能行得通。沒有哪個設計一定能掃,所以請測試印刷樣張。
可以在深色背景上用白點嗎?
標準允許深底淺碼,但支援與否取決於應用:ZXing 只有被告知時才會嘗試反色影像。淺底深碼更穩妥;任何反色設計都請在受眾的手機上測試。
設計最多可以覆蓋 QR Code 的多少面積?
糾錯級別無法換算成面積百分比。糾錯級別是按碼字比例定義的,翻轉一個模組就會毀掉它所在的整個碼字。請測試實際檔案。
為什麼我設計的 QR Code 掃不出來?
檢查是否顏色反轉、角被遮蓋、邊距不足四個模組、深淺點對比太弱,以及印得太小。排錯清單涵蓋了其他原因。
參考來源
- ZXing project — DefaultGridSampler.java. Undated source file. Accessed 17 October 2026.
- Chu, H.-K., et al. — Halftone QR Codes. ACM Transactions on Graphics 32(6), Article 217, SIGGRAPH Asia 2013 (author-hosted PDF, National Tsing Hua University; publisher record: ACM Digital Library). Published 1 November 2013. Accessed 17 October 2026.
- ISO/IEC — ISO/IEC 18004:2006, QR Code 2005 bar code symbology specification. Second edition, published 1 September 2006 (copy hosted by Public.Resource.Org). Accessed 17 October 2026.
- ISO — ISO/IEC 18004:2024 standard page. Fourth edition, published August 2024. Accessed 17 October 2026.
- Pena-Pena, K., Lau, D. L., Arce, G. R. — Colored-QRNet: Fast QR Code Color Image Embedding. EUSIPCO 2022 proceedings. Published 2022. Accessed 17 October 2026.
- ZXing project — DecodeHintType.java. Undated source file. Accessed 17 October 2026.
- jsQR project — README. Undated. Accessed 17 October 2026.
- DENSO WAVE — Examples of problems encountered in reading a code. QRcode.com, undated. Accessed 17 October 2026.
- ZXing project — HybridBinarizer.java. Undated source file. Accessed 17 October 2026.
- DENSO WAVE — Error correction feature. QRcode.com, undated. Accessed 17 October 2026.
- DENSO WAVE — Point for setting the module size. QRcode.com, undated. Accessed 17 October 2026.