データからパターンへ
QRコードを作るには、まずデータに合ったエンコードモード(数字、英数字、バイト、漢字)を選びます。エンコーダーはデータをビットに変換して8ビットのコード語に分け、選んだレベルのリード・ソロモン誤り訂正コード語を加えます。そのうえで、収まる最小の型番を選びます。
コード語は、固定パターンを避けながらジグザグの経路でマス目に並べられます。最後にエンコーダーが8種類のマスクパターンのうち1つを適用し、大きな空白領域や紛らわしい形を崩します。使ったマスクと誤り訂正レベルは、形式情報に記録されます。
- エンコードモードを選ぶ
- データをエンコードし、誤り訂正コード語を加える
- 型番(サイズ)を決める
- ファインダー、タイミング、アライメントの各パターンを配置する
- データモジュールを埋める
- 8種類のマスクから最適なものを適用し、形式情報を書き込む
カメラ画像からデータへ
デコードは、同じ手順を逆にたどります。スキャナーは、明暗の比が1:1:3:1:1というほかの画像にはあまり現れない特徴を持つ3つのファインダーパターンを見つけ、それとタイミングパターン、アライメントパターンを使ってマス目を割り出します。次に形式情報を読み取り、マスクを外して、コード語を集めます。
続いてリード・ソロモン復号によって、誤って読み取ったコード語を、誤り訂正レベルの限界まで修復します。損傷が多すぎる場合は、間違ったデータを返さずに読み取りに失敗します。QRコードが文字化けした結果を返すことがほとんどないのは、このためです。
サイズとコントラストが重要な理由
どの工程も、カメラが暗いモジュールと明るいモジュールを見分けられることを前提にしています。モジュールが小さい、コントラストが低い、光が反射している、ぼやけている、クワイエットゾーンがないといった状態では、判断に迷うモジュールが増え、誤り訂正が吸収できる量にも限りがあります。データを短くし、コントラストを強くし、余白を確保すれば、デコーダーの負担を最小限にできます。