「このQRコードは誤り訂正レベルいくつで作られているのか」を調べたい場面があります。実は、レベルはQRコードの中に数値として書き込まれていて、決まった位置の2マスを見るだけで判別できます。本記事では形式情報の構造から、目視での確認手順、ツールでの確認までを解説します。
マス目の細かさでは判別できない
「誤り訂正レベルが高いQRコードほどマス目が細かい」というのは、同じデータを同じ条件で生成して比べたときだけ成り立つ話です。実際のQRコードの細かさ(=一辺のモジュール数)は、誤り訂正レベルだけでなく入っているデータの量とバージョン(1〜40)でも決まります。
そのため、目の前にある1枚のQRコードを見て「密だからHだろう」と判断することはできません。データ量が少なければレベルHでも小さなQRコードになりますし、長いURLならレベルLでも十分に細かくなります。誤り訂正レベルは、見た目の印象ではなくコードの中に書かれている値を読むのが正しい確認方法です。
レベルは「形式情報」に書かれている
QRコードには、データ本体とは別に 形式情報(Format Information) という領域があります。JIS X 0510 / ISO/IEC 18004 で定められたもので、ここに誤り訂正レベルとマスクパターン番号が記録されています。読み取り機はデータを取り出す前に、まずこの形式情報を読んで「どのレベルで訂正すればよいか」「どのマスクを解除すればよいか」を知ります。
形式情報は全部で15ビットあり、内訳は次のとおりです。
- 2ビット:誤り訂正レベル(L / M / Q / H)
- 3ビット:マスクパターン番号(0〜7)
- 10ビット:上の5ビットを守るための誤り訂正ビット(BCH(15,5) 符号)
さらに、この15ビット全体に固定パターン 101010000010010 が XOR されます。これは、形式情報が全て同じ色に偏って読み取り機が混乱するのを防ぐための処理です。形式情報そのものが BCH 符号で守られているため、形式情報の一部が汚れていても最大3ビットまでは訂正できます。
目視で確認する手順 — 見るのは2マスだけ
ここからが実用的な部分です。座標を「左上のマスを (行0, 列0)、行は下方向、列は右方向」と決めます。左上のファインダパターンは行0〜6・列0〜6を占め、その外側の行7・列7は分離パターン(白)です。そして行8が形式情報の行になります。
この行8のいちばん左の2マス、つまり (行8, 列0) と (行8, 列1) を見るだけで、誤り訂正レベルが分かります。
| (行8,列0) | (行8,列1) | 誤り訂正レベル | 復元できる量の目安 |
|---|---|---|---|
| 黒 | 黒 | L | 約7% |
| 黒 | 白 | M | 約15% |
| 白 | 黒 | Q | 約25% |
| 白 | 白 | H | 約30% |
なぜこの2マスだけで決まるのかというと、形式情報の先頭2ビットがちょうど誤り訂正レベルの指示子だからです。規格上の指示子は L=01 / M=00 / Q=11 / H=10 で、これに XOR マスク 101010000010010 の先頭2ビット 10 を掛け合わせた結果が、そのまま (行8,列0) と (行8,列1) に現れます。マスクパターン番号は後ろの3ビットに入るので、この2マスはマスクの選ばれ方に影響されません。バージョン1(21×21)からバージョン40(177×177)まで、位置も対応も同じです。
実演:レベルを切り替えて2マスの変化を見る
ボタンで誤り訂正レベルを切り替えると、ブラウザ上でQRコードを生成し直し、上の表で使う2マス(左上の下と左下の端、赤い枠)を強調表示します。レベルによって色の組み合わせが変わることを確認してください。
もう1か所で検算する
形式情報は2か所にあるので、答え合わせができます。一辺のモジュール数を N とすると、2つ目のコピーの先頭2ビットは (行 N-1, 列8) と (行 N-2, 列8)、つまり左下のファインダの右隣の列を、いちばん下から上に2マス数えた位置です。ここの色の組み合わせは1つ目と同じになります。上の実演でも、この2マスを合わせて赤枠で示しています。
なお、左下のファインダのすぐ上、(行 N-8, 列8) のマスは常に黒と決められています(ダークモジュール)。数え始める位置の目印に使えます。
ツールで確認する
目視は仕組みの理解には向いていますが、印刷物の写真やデザインQRのように輪郭がはっきりしない場合は、解析ツールに任せるのが確実です。画像をアップロードすると、誤り訂正レベル・バージョン・マスクパターンをまとめて表示できます。
Free Tool QR Code Analyzer で誤り訂正レベルを確認する 手元のQRコード画像から、誤り訂正レベル・バージョン・マスクパターン・格納データを解析します。読み取り自体ができないほど画像が荒れている場合は、先に画像を鮮明化してから解析します。手順は「写真のQRコードが読めない…を復元する仕組み」で解説しています。
これから作るQRコードのレベルを確かめる
自分で生成する場合は、生成時に指定した値がそのまま形式情報に入ります。指定を忘れると生成ライブラリの既定値(多くの実装で M)になるため、ロゴを重ねる予定があるのに既定のままだったという取り違えが起きやすい部分です。生成後に上の2マスを見れば、意図したレベルになっているかをその場で確認できます。
レベルごとの向き不向きは、「QRコードの誤り訂正レベルを理解する」にまとめています。
まとめ
- 誤り訂正レベルは見た目の密度では判別できない。データ量とバージョンにも左右されるため。
- レベルは形式情報(15ビット)の先頭2ビットに入っている。
- 目視なら (行8, 列0) と (行8, 列1) の2マス。黒黒=L / 黒白=M / 白黒=Q / 白白=H。
- 同じ内容が左下側にもあるので検算できる((行 N-1, 列8) と (行 N-2, 列8))。
- 写真やデザインQRなど判別しにくい場合は解析ツールを使う。
よくある質問(FAQ)
QRコードの誤り訂正レベルはどこを見れば分かりますか?
形式情報という15ビットの領域に記録されています。目視で確認する場合は、左上のファインダパターンの下、(行8, 列0) と (行8, 列1) の2マスを見ます。黒黒がL、黒白がM、白黒がQ、白白がHです。
マス目が細かいほど誤り訂正レベルが高いのですか?
いいえ。一辺のモジュール数は誤り訂正レベルだけでなく、格納するデータ量とバージョン(1〜40)でも決まります。同じデータを同じ条件で生成して比べたときにだけ、レベルが高いほど密になります。
形式情報の15ビットには何が入っていますか?
誤り訂正レベルが2ビット、マスクパターン番号が3ビット、それらを守るBCH(15,5)符号の誤り訂正ビットが10ビットです。さらに全体に固定パターン101010000010010がXORされます。
形式情報が汚れていても読み取れますか?
形式情報はBCH符号で保護されているため最大3ビットまでの誤りを訂正できます。加えて同じ内容が符号内の2か所に配置されているため、片方が破損しても、もう片方から読み取れる設計になっています。