QR コードのしくみ
文字列が QR コードになるまでを、データのビット列・リード・ソロモン符号・モジュールの配置・マスクの選び方の順に見せます。モジュールを押したり汚れを付けたりして、どこまで壊れても読み取れるかを確かめられます。
例
誤り訂正レベル(復元できる割合の目安)
- モード
- 英数字
- 型番
- 1(21×21 モジュール)
- 誤り訂正レベル
- M(約 15%)
- コードワード
- データ 16 + 誤り訂正 10 = 26 個
- マスク
- 0(失点が最小)
データの容量の使用率 57.8%(74 / 128 ビット)
①データのビット列
先頭に「どのモードか」と「何文字か」を書き、続けて文字を 2 文字ずつ 11 ビット(45 進)で表します。容量が余ったら、終端パターンと埋め草(0xEC と 0x11 の交互)で埋めます。
8 ビットずつ区切ったデータのコードワード(16 進)
20 5B 0B 78 D1 72 DC 4D 43 40 EC 11 EC 11 EC 11
②誤り訂正のコードワード
データのコードワードを 1 個のブロックに分け、ブロックごとにリード・ソロモン符号で 10 個の誤り訂正コードワードを付けます。1 ブロックで 5 個まで、壊れたコードワードを直せます。最後に、各ブロックの 1 番目、2 番目…と交互に並べ、汚れが 1 つのブロックに集まらないようにします。
| ブロック | データ | 誤り訂正 |
|---|---|---|
| 1 | 20 5B 0B 78 D1 72 DC 4D 43 40 EC 11 EC 11 EC 11 | C4 23 27 77 EB D7 E7 E2 5D 17 |
並べ替えた順(下の数字はブロックの番号)
③モジュールの配置
まず、読み取りの目印になる機能パターンを置きます。残りの場所に、右下から 2 列ずつ上下に折り返しながら、コードワードを 1 ビットずつ置きます(タイミングパターンの列は飛ばします)。端数の場所は残余ビット(0)です。
- データのコードワード(交互に 2 色)
- 誤り訂正のコードワード
- まだ置いていない場所
26 番目: 17(00010111)— ブロック 1 の誤り訂正
④マスク
白黒が偏ったり、位置検出パターンに似た模様ができたりすると読み取りにくくなるので、データの部分を 8 種類の模様で反転(XOR)し、失点が一番小さいものを選びます。選んだマスクの番号は形式情報に書き込みます。押すとそのマスクを使います。
マスク 0 の模様(黒が反転する場所)
| マスク | 条件 | N1 | N2 | N3 | N4 | 合計 |
|---|---|---|---|---|---|---|
| 0(最小) | (i + j) mod 2 = 0 | 172 | 99 | 760 | 0 | 1031 |
| 1 | i mod 2 = 0 | 182 | 144 | 760 | 0 | 1086 |
| 2 | j mod 3 = 0 | 205 | 117 | 840 | 0 | 1162 |
| 3 | (i + j) mod 3 = 0 | 196 | 147 | 760 | 0 | 1103 |
| 4 | (⌊i/2⌋ + ⌊j/3⌋) mod 2 = 0 | 183 | 144 | 760 | 0 | 1087 |
| 5 | (ij) mod 2 + (ij) mod 3 = 0 | 194 | 174 | 840 | 0 | 1208 |
| 6 | ((ij) mod 2 + (ij) mod 3) mod 2 = 0 | 186 | 129 | 800 | 0 | 1115 |
| 7 | ((i + j) mod 2 + (ij) mod 3) mod 2 = 0 | 165 | 120 | 800 | 0 | 1085 |
N1: 同じ色が 5 個以上続く(5 個で 3 点、1 個増えるごとに +1)/ N2: 2×2 が同じ色(3 点)/ N3: 黒白黒黒黒白黒の両側どちらかに白が 4 個(40 点)/ N4: 黒の割合が 50% から 5% 離れるごとに 10 点
⑤汚して読み取る
モジュールを押すと白黒が反転します。汚れを付けて、読み取れるかを確かめてください。読み取りでは、形式情報からレベルとマスクを知り、マスクを戻してコードワードを取り出し、ブロックごとに誤りを直します(位置と大きさはわかっている前提です)。
反転したモジュール 0 個(全体の 0.0%)
読み取れました
HELLO WORLD
形式情報: レベル M・マスク 0
| ブロック | 壊れたコードワード | 直せる数 |
|---|---|---|
| 1 | 0 個(直した) | 5 個まで |
⑥誤り訂正レベルと汚れへの強さ
同じ文字列を 4 つのレベルで QR コードにし、ランダムな場所に正方形の汚れ(黒か白で塗りつぶす)を付けて、40 回ずつ読み取れた割合を調べます。レベルを上げると型番(大きさ)も変わることがあります。
使い方
- 文字列を入力し、誤り訂正レベルを選びます。モード・型番・マスクは自動で選びますが、自分で変えることもできます。
- ① から ④ で、データのビット列・誤り訂正のコードワード・モジュールの配置・マスクの順に、QR コードができるまでを確かめられます。③ の再生ボタンで、コードワードを置いていく順番を見られます。
- ⑤ では、モジュールを押したり汚れを付けたりして、どこまで壊れても読み取れるかを試せます。⑥ では、誤り訂正レベルごとの汚れへの強さを比べます。
- できた QR コードは PNG で保存できます。入力した文字列はブラウザの外に送りません。
QR コードのしくみ
QR コードは、白黒の正方形(モジュール)を並べた 2 次元のコードです。3 つの角にある大きな四角(位置検出パターン)は、どの向きから見ても黒白黒黒黒白黒(1:1:3:1:1)の比になっていて、カメラはこれを手がかりにコードの位置と向きを知ります。タイミングパターンの白黒の交互で 1 モジュールの大きさを、位置合わせパターンで歪みを補正します。
データは 8 ビットのコードワードに区切り、リード・ソロモン符号の誤り訂正コードワードを付けます。誤り訂正レベルを上げるほど誤り訂正コードワードの割合が増え、汚れや欠けに強くなる代わりに、同じ大きさに入るデータが減ります。H では全体の約 30% のコードワードが壊れても元に戻せるので、中央にロゴを重ねたデザインの QR コードでもよく使われます。
注意事項
- 型番 1〜10(21×21〜57×57)の数字・英数字・8 ビットバイトの各モードに対応しています。漢字モードや、複数のモードを混ぜる符号化には対応していません。日本語は UTF-8 のバイトとして入れます。
- 読み取りは、位置と大きさがわかっている前提で、データの部分だけを調べます。実際の読み取りアプリでは、位置検出パターンが汚れると読み取れないことがあります。