Hayami Kaito Web
← Apps

QR コードのしくみ

文字列が QR コードになるまでを、データのビット列・リード・ソロモン符号・モジュールの配置・マスクの選び方の順に見せます。モジュールを押したり汚れを付けたりして、どこまで壊れても読み取れるかを確かめられます。

例

誤り訂正レベル(復元できる割合の目安)

モード
英数字
型番
1(21×21 モジュール)
誤り訂正レベル
M(約 15%)
コードワード
データ 16 + 誤り訂正 10 = 26 個
マスク
0(失点が最小)

データの容量の使用率 57.8%(74 / 128 ビット)

①データのビット列

先頭に「どのモードか」と「何文字か」を書き、続けて文字を 2 文字ずつ 11 ビット(45 進)で表します。容量が余ったら、終端パターンと埋め草(0xEC と 0x11 の交互)で埋めます。

モード指示子文字数指示子データ終端パターンビットの埋め草埋め草コードワード
0010英数字0000010111101100001011HE01111000110LL10001011100O 10110111000WO10011010100RL001101D00000011101100EC000100011111101100EC000100011111101100EC0001000111

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 つのブロックに集まらないようにします。

ブロックデータ誤り訂正
120 5B 0B 78 D1 72 DC 4D 43 40 EC 11 EC 11 EC 11C4 23 27 77 EB D7 E7 E2 5D 17

並べ替えた順(下の数字はブロックの番号)

2015B10B1781D11721DC14D1431401EC1111EC1111EC1111C41231271771EB1D71E71E215D1171

③モジュールの配置

まず、読み取りの目印になる機能パターンを置きます。残りの場所に、右下から 2 列ずつ上下に折り返しながら、コードワードを 1 ビットずつ置きます(タイミングパターンの列は飛ばします)。端数の場所は残余ビット(0)です。

  • データのコードワード(交互に 2 色)
  • 誤り訂正のコードワード
  • まだ置いていない場所

26 番目: 17(00010111)— ブロック 1 の誤り訂正

④マスク

白黒が偏ったり、位置検出パターンに似た模様ができたりすると読み取りにくくなるので、データの部分を 8 種類の模様で反転(XOR)し、失点が一番小さいものを選びます。選んだマスクの番号は形式情報に書き込みます。押すとそのマスクを使います。

マスク 0 の模様(黒が反転する場所)

マスク条件N1N2N3N4合計
0(最小)(i + j) mod 2 = 01729976001031
1i mod 2 = 018214476001086
2j mod 3 = 020511784001162
3(i + j) mod 3 = 019614776001103
4(⌊i/2⌋ + ⌊j/3⌋) mod 2 = 018314476001087
5(ij) mod 2 + (ij) mod 3 = 019417484001208
6((ij) mod 2 + (ij) mod 3) mod 2 = 018612980001115
7((i + j) mod 2 + (ij) mod 3) mod 2 = 016512080001085

N1: 同じ色が 5 個以上続く(5 個で 3 点、1 個増えるごとに +1)/ N2: 2×2 が同じ色(3 点)/ N3: 黒白黒黒黒白黒の両側どちらかに白が 4 個(40 点)/ N4: 黒の割合が 50% から 5% 離れるごとに 10 点

⑤汚して読み取る

モジュールを押すと白黒が反転します。汚れを付けて、読み取れるかを確かめてください。読み取りでは、形式情報からレベルとマスクを知り、マスクを戻してコードワードを取り出し、ブロックごとに誤りを直します(位置と大きさはわかっている前提です)。

反転したモジュール 0 個(全体の 0.0%)

読み取れました

HELLO WORLD

形式情報: レベル M・マスク 0

ブロック壊れたコードワード直せる数
10 個(直した)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 のバイトとして入れます。
  • 読み取りは、位置と大きさがわかっている前提で、データの部分だけを調べます。実際の読み取りアプリでは、位置検出パターンが汚れると読み取れないことがあります。