QRコードは、白と黒の正方形が並んだ格子で、カメラはそれを長い0と1の列として読み取ります。四隅のうち3つの大きな正方形は、スマートフォンにコードの位置と向きを伝え、残りのパターンはデータと、内蔵されたバックアップコピーを運びます。このおかげで、コードは傷や汚れ、シールが貼られても読み取れます。以下、各部品の働きをわかりやすく説明します。
カメラ画像からモジュールの格子へ
カメラをQRコードに向けると、アプリはまず写真をコンピュータが処理できる形に変換します。明るさのしきい値を決めて画像を白黒に変換し、線より暗い部分は黒、明るい部分は白になります。ぼやけた写真や影のある写真ではこの処理が難しくなるため、くっきりと明るく撮影されたコードほど確実に読み取れます。
パターンの中の最小の正方形をモジュールと呼びます。読み取り側では、各モジュールは1ビットの情報です。黒いモジュールが片方の値、白いモジュールがもう片方の値に対応します。四隅の大きな正方形からデータ本体まで、すべては格子状に並んだモジュールにすぎません。
コードの周囲にはクワイエットゾーンと呼ばれる余白があり、慣例では4モジュール分の幅です。カメラが検出しやすいきれいな縁を与え、コードを雑然とした背景から切り離します。他の図柄にぴったり接して印刷されたコードが読みにくいのは、まさにこのためです。
3つの位置検出パターン
左上、右上、左下の3つの隅には、QRコードの最も特徴的な部分があります。黒い外側のリング、白いリング、そして塗りつぶされた黒い3×3の中心からなる、入れ子状のリングでできた大きな正方形です。これが位置検出パターンで、すべてのスキャナが最初に直面する問題、つまりコードがどこにあり、どの向きなのかを解決します。
スキャナは画像上に線を滑らせ、特定のリズムを探すことで位置検出パターンを見つけます。位置検出パターンの中心を通る線は、黒・白・黒・白・黒と横切り、その幅の比は1:1:3:1:1です。黒1モジュール、白1、黒3、また白1、黒1。この特徴的な並びは珍しいため、写真の中の他のほとんどのものと区別できます。
なぜ位置検出パターンは3つで、4つではないのでしょうか。正方形の位置を特定するには3つの隅で十分で、欠けた1つの隅にも意味があります。読み取り側にどちらが「上」かを伝えるのです。コードを逆さまや横向きにスキャンしても、読み取り側は復号の前に格子をどれだけ回転すればよいか正確にわかります。
タイミングパターンとアラインメントパターン
隅の位置がわかっただけでは不十分です。コードを斜めから撮影したり、曲面に印刷したりすると、間の格子は伸びたり歪んだりします。それを正しく保つのが、さらに2つの構造です。
タイミングパターンは、位置検出パターンの間を走る黒と白が交互に並んだ破線です。上端に1本、左端に1本あります。物差しのような役割で、交互の繰り返しを数えることで、読み取り側はモジュールの正確なサイズと、コード全体で格子をどう配置すべきかを確認します。
アラインメントパターンは一辺5モジュールの、より小さな入れ子状の正方形で、バージョン2以降に登場し、右下寄りに配置されます。大きいコードには複数あります。それぞれが追加の目印として機能し、読み取り側はその部分の格子の歪みを測って補正できます。コードがボトルに巻かれていたり、ラベルが少ししわになっていたりする場合に不可欠です。
バージョン1〜40
QRコードには40のサイズがあり、バージョンと呼ばれます。バージョン1は21×21のモジュールの格子です。バージョンが上がるごとに1辺あたり4モジュールずつ増え、バージョン2は25×25、バージョン3は29×29、という具合にバージョン40では177×177になります。
格子が大きいほどデータの容量も増えます。目安として、最大のバージョンでは約7,000桁の数字を格納でき、短いURLならずっと小さいコードで十分収まります。正確な容量は、何をエンコードするか(数字はテキストより密に詰め込めます)と、選んだ誤り訂正レベルによっても変わります。
生成されたコードの見た目が大きく変わるのは、このためでもあります。エンコードツールは内容が収まる最小のバージョンを選ぶため、短いリンクは粗くゴツゴツしたコードに、長いリンクは緻密で細かいパターンになります。
データコードワードと誤り訂正コードワード
構造用のパターンが場所を取った後、残りの領域にデータが入ります。ビットはコードワードと呼ばれる8モジュール単位のグループにまとめられ、1つが1バイトの情報に相当します。
コードワードには2種類あります。データコードワードはURLやテキストなど、コードがエンコードした実際の内容を運びます。誤り訂正コードワードは賢い予備で、リード・ソロモン符号という数学の一分野を使ってデータから計算されます。CDやDVDのデータを守っていたのと同じ系統の技術です。読み取り側はこれらを使ってデータを検証し、欠けている部分を修復します。
QRコードにはL、M、Q、Hという4つの誤り訂正レベルがあります。おおまかに言うと、それぞれ約7%、15%、25%、30%のコードワードを復元できます。トレードオフはスペースです。レベルが高いほどコードの多くが予備に確保され、データに使える部分が減るため、同じ内容でも大きなバージョンが必要になることがあります。
中央にロゴを重ねたQRコードでもスキャンできるのはこのためです。設計者が高い誤り訂正レベルを選び、予備のコードワードに隠れた部分を吸収させているのです。
マスキング
生のデータをそのまま配置すると、グリッドが見づらくなることがあります。大きな空白の領域や、偶然にもファインダーパターンに似た四角の集まりができ、スキャナーを混乱させることもあります。その解決策がマスキングです。
エンコードツールは、市松模様、横縞や縦縞などの8種類の定義済みマスクパターンから1つを選び、マスクの黒い四角に当たるモジュールをすべて反転させます。データ自体は変わらず、見た目だけが変わり、反転は完全に元に戻せます。
ツールは8つのマスクをすべて試し、ペナルティルール(同じ色が長く続く、ファインダーパターンに似ている、黒と白の面積が極端に偏る)でそれぞれの結果を採点し、ペナルティが最も低いものを採用します。どのマスクを使ったかは、ファインダーの横にある小さな形式情報の領域に記録されます。安全のため2回書き込まれているので、角が擦れても読み取り側が推測に困ることはありません。
同じリンクでも、異なるツールでエンコードすると見た目の異なる2つのコードになることがあります。これも同じ理由です。どちらも正しく、マスクの選択が違うだけです。
簡単な実例
テキスト「HI」を例にします。エンコーダーはまず、続くデータの種類と長さを示す数ビットの設定情報を書き込み、次に内容自体を書き込みます。各文字は8ビットで格納されます。Hは01001000、Iは01001001になります。この16ビットが、1ビットにつき1モジュールとして、グリッド上の16個のモジュールになります。
ビットは右下の角から上下に蛇行する2列の帯でグリッドに配置され、ファインダー、タイミング、形式の各領域は避けて通ります。データの後には、そこから計算された誤り訂正コードワードのブロックが隣に収められます。最後に選択されたマスクを適用し、一部のモジュールを反転させて不運なパターンを崩します。
これがレシピのすべてです。まず構造、次にデータ、次に予備、そしてマスク。今までスキャンしたすべてのQRコードは、この同じ手順を大きなスケールで繰り返したものです。
重要なポイント
QRコードは自己記述的な画像です。ファインダーパターンは「ここにいる、こちらが上」と告げ、タイミングパターンとアラインメントパターンはグリッドをまっすぐに整え、バージョンがサイズを決め、コードワードが内蔵の予備とともにデータを運び、マスキングがパターン全体を読み取りやすく保ちます。次にスキャンするとき、またはQRCodeMax.Vipで自分のコードを生成するときは、ズームインしてみてください。これらの部品がすべて連携しているのが見つかるはずです。