QRコードにブランドカラーを当てた途端に読めなくなる、という相談は多くあります。原因のほとんどは色そのものではなく、カメラが見ている明るさの差にあります。本記事では、なぜ色を変えると読めなくなるのか、どこまでなら変えてよいのかを整理します。
カメラは色ではなく明るさを見ている
QRコードの読み取りは、撮影した画像をまず明るいセルと暗いセルの2値に分ける処理から始まります。ここで使われるのは色相ではなく輝度です。つまり読み取り機にとって、コードは最初から白黒の画像として扱われます。
この段階を通れば、あとは誤り訂正が効くので多少の汚れやかすれは復元できます。逆に、2値化の段階で明暗が分かれなければ、そこから先の処理はすべて働きません。色の問題は誤り訂正で救えないのはこのためです。
手元のコードがどのように2値化されるかを確かめたいときは、画像編集ソフトでグレースケールに変換してみるのが最も早い方法です。グレーにしたときに模様が判別できなければ、読み取り機にも判別できません。
明暗の向きを反転させない
QRコードは明るい背景に暗いセルを置くことを前提に設計されています。黒地に白のコード、いわゆる反転コードは規格の想定外です。
実際には、反転コードを読める読み取り機は存在します。反転を自動で判定する実装があるためです。ただしそれは実装ごとの好意であって、保証された動作ではありません。手元の端末で読めたことは、配布先の全員が読めることを意味しません。印刷物のように後から差し替えられない媒体では、反転させない判断が無難です。
やむを得ず暗い背景に置く場合は、コードの部分だけ明るい下地を敷き、その上に暗いセルを置く形にします。これなら明暗の向きは保たれます。
どれくらいの明るさの差が必要か
目安として、前景色と背景色の相対輝度の比が 4:1 以上あれば、通常の照明下ではまず問題になりません。3:1 を下回ると、照明が暗い場所や斜めから撮った場合に失敗が増えます。
ここで注意したいのは、見た目の派手さと輝度差は別物だということです。赤と黒の組み合わせは目には強い対比に見えますが、輝度で見ると差が小さく、グレースケールにすると両方とも暗いセルに潰れます。同じことが、濃い青と黒、濃い緑と黒でも起きます。
逆に、黄色と黒、水色と濃紺のように明るい側が十分に明るい組み合わせは、色が付いていても読み取りに支障が出にくくなります。色を変えるなら、暗いセルの側ではなく明るい背景の側を白に近く保つのが定石です。
避けたほうがよい組み合わせ
- 赤いセルに黒い背景 — 輝度差が出ない典型例です。
- 明るいセルに白い背景 — 淡いパステルカラーのセルは、白背景との差が足りません。
- グラデーションのセル — 場所によって輝度が変わるため、2値化のしきい値が定まりません。
- 金や銀などの光沢インク — 撮影角度によって明るさが反転します。読める角度と読めない角度が生まれます。
- セルと背景の両方に色を付ける — 片方だけにするほうが失敗しにくくなります。
背景写真の上に置く場合
写真やイラストの上にコードを重ねる構成は、輝度が場所ごとに変わるため最も失敗しやすい形です。対処は単純で、コードの下に無地の下地を敷くことに尽きます。
このとき、下地はコードの外側にも広げる必要があります。QRコードの規格では周囲に4モジュール分の余白(クワイエットゾーン)が求められており、その余白まで含めて明るい下地でなければ意味がありません。余白の内側だけ白くして、外側が写真のままだと、境界が正しく検出されないことがあります。
下地の形は四角でなくても構いませんが、余白を削らないことが条件です。角丸にしたい場合は、削るのではなく下地を一回り大きくしてから角を丸めます。
変える前に測る
色を決めてから読めるかどうかを試すのではなく、候補の色で実際にコードを作って確かめるのが確実です。生成したコードを一度画像として保存し、グレースケールで模様が判別できるか、暗い場所でも読めるかを見ます。
手元のコードで確かめる
前景色と背景色を指定してコードを作る、作ったコードの構造を読み解く、うまく読めないコードの原因を調べる、それぞれのツールを用意しています。
まとめ
色を変えて読めなくなる原因は、色そのものではなく明るさの差です。判断の順番は、明暗の向きを反転させないこと、明るい側を十分に明るく保つこと、余白まで含めて無地の下地を敷くことの3つになります。この3つを守れば、ブランドカラーを当てても読み取りはおおむね安定します。関連して、余白の取り方は印刷サイズの記事、読めないコードの切り分けは読み取れない原因の記事で扱っています。