QRコードは1.2:1でも読み取れる。だが、その近くで設計してはいけない

KoloQRチーム調査

青い背景に置かれた白黒の丸型QRコードのステッカー。その下に「Minimum Contrast」と書かれたシアンの角丸の帯と、黒いドットと16進値の#000000を並べた白い帯がある。

大半のQRコードを読み取っているカメラアプリについて、AppleもGoogleもコントラストのしきい値を公表していません。ですからiPhoneやAndroidの限界として引用されるどの数値も、誰も公表していない測定値からの引用です。読めるのは、それ以外の大きな部分を支えるオープンソースのデコーダーZXingのソースです。8×8ピクセルのブロック単位で動作し、最も明るいピクセルと最も暗いピクセルの差が255段階中24以内であるブロックには、境界がまったく存在しないとみなします。これはコントラスト比にしておよそ1.24:1、白地にかろうじて見えるグレーです。制約はデコーダーではありません。100%ではなく85%しか反射しない紙、広がるインク、黒を持ち上げる映り込み、0.5ミリの手ブレこそが制約であり、実務上の数値が画面で4:1、印刷で7:1である理由です。

要点

  • AppleもGoogleも、iOSとAndroidに組み込まれたQR読み取りのコントラストしきい値を公表していません。したがって「iPhoneの限界」「Androidの限界」として引用される単一の数値は、誰にも検証できない測定値です。検証できるのは、オープンソースのデコーダーZXingの公開されたソースと、印刷品質規格ISO/IEC 15415です。
  • ZXingのハイブリッド二値化器は8×8ピクセルのブロック単位で動作し、最も明るいピクセルと最も暗いピクセルの差が255段階中24以内であるブロックには、境界が存在しないとみなします。白を基準にすると24段階はグレーの#E7E7E7、コントラスト比にしておよそ1.24:1です。
  • 画面向けは4:1、印刷向けは7:1を目標に設計し、3:1をそれ以下では出荷してはならない線として扱ってください。1.24:1と7:1の隔たりは迷信ではありません。デコーダーが何かを見る前に、紙、環境光、映り込み、ブレがデザイン上の数値から差し引くぶんです。
  • コントラスト比は、カメラが測っているものではありません。この比率は知覚輝度のうち緑を71%と重み付けし、フレア項を加えます。カメラの輝度チャンネルは緑を59%と重み付けし、何も加えません。両者が最も食い違うのは彩度の高い赤・緑・青であり、比率のほうが厳しい値を出します。
  • ブレと低コントラストは足し算ではなく掛け算で効きます。ブレは隣り合うピクセルを平均化し、その結果、各ブロック内の最明から最暗までの幅、つまり二値化器がしきい値を求めるまさにその量を減らすからです。静止した写真で3:1を耐え抜くコードも、動く手の中では3:1で失敗します。

誰もその数値を公表していない。そこが出発点である

iPhoneとAndroidのカメラに組み込まれたQRコード読み取りについて、公表されたコントラストしきい値は存在しません。Appleのバーコード検出はVisionフレームワークの中に、AndroidのそれはGoogle Play Servicesの中にあり、どちらも非公開で、この点について文書化されておらず、いずれも最小値を表明したことがありません。3:1、4:1、40%といった数値を挙げる記事は、別の目的で書かれたデザインガイドラインを引いているか、何も引いていないかのどちらかです。

これは回り道をせず率直に述べる価値があります。誠実な答えの形が、そこから導かれるからです。研究所を持たなくても確かめられることが3つあります。オープンソースのデコーダーが何をしているか、ソースが公開されているからです。印刷品質規格が何を測っているか、公開された規格だからです。そして特定のコードが特定のスマートフォンでどう振る舞うか、20分とプリンターがあれば済むからです。この主題に関するそれ以外のすべては、誰かの印象にすぎません。

この問いが繰り返し尋ねられる理由は、コントラストがQRコードの変数の中で唯一、デザイナーが意図せずに決めてしまうものだからです。モジュールサイズは意図的な判断です。誤り訂正も意図的な判断です。色は、誰かがQRコードのことを考える3年前にブランドパレットのために選ばれ、コードはそれを受け継ぎます。ですから実務上の問いは「最小値はいくつか」ではなく「このパレットにはどれだけの余裕が残っているか」であり、こちらには答えがあります。

デコーダーが実際に測っているのは局所的な差である

デコーダーは、あなたの前景色と背景色を比較することは決してありません。カメラのフレームを単一のグレーチャンネルに変換し、ピクセルの小さな近傍ごとに、その近傍で暗と明の境界がどこに落ちるかを決め、その結果からモジュールを読み取ります。二値化とは、デコーダーがモジュールを読もうとする前に、グレースケールの写真を純粋な白と黒のピクセルに変換する工程です。コントラストの許容度に関わることは、すべてそこで決まります。

読む価値のあるデコーダーはZXingです。広く使われているものの中で、ソースが公開されている唯一のものだからです。既定のハイブリッド二値化器は画像を8×8ピクセルのブロックに分割し、各ブロックで最も明るいピクセルと最も暗いピクセルを求め、そのブロックのしきい値を両者の中間に設定します。画像の寸法が40ピクセルを下回ると、局所的な手法を捨てて画像全体を一度にしきい値処理します。

興味深いのは、そのブロック処理に置かれた条件分岐の定数です。ブロック内の最も明るいピクセルと最も暗いピクセルの差が255段階中24以下であれば、ZXingはそこからしきい値を計算せず、そのブロックには明るいピクセルだけ、あるいは暗いピクセルだけが含まれると仮定して、近傍から推定値を借ります。白から24段階下はグレーの#E7E7E7で、コントラスト比にしておよそ1.24:1です。モジュールサイズに余裕のあるきれいなデジタル画像では、これが下限です。

そこから2つの帰結が導かれ、どちらも数値そのものより有用です。ひとつめは、コントラストが測られるのはページ全体ではなく、数モジュール分ほどの面積にわたる局所だということです。背後の緩やかなグラデーションが見た目ほど危険でないのも、背後の写真が致命的なのも、これが理由です。グラデーションはどこでも局所的な差を保ちます。写真は、シンボルを横切る途中でモジュールが境界のどちら側に落ちるかを反転させます。

ふたつめは、コントラストとサイズが衣装を変えた同じ問題だということです。ブロックは8×8モジュールではなく8×8のカメラピクセルですから、ひとつのブロックに何モジュール入るかは、シンボルがセンサー上にどれだけ大きく写るかで完全に決まります。フレームいっぱいに写るコードでは1モジュールあたり複数のブロックが得られ、しきい値はそのモジュール自身の縁から計算されます。遠すぎる位置から撮られたコードでは、1つのブロックが複数のモジュールにまたがり、しきい値はそれらすべてを平均したものになります。まったく同じアートワークから、実効的な差が小さくなるということです。したがって読み取り距離に合わせたコードの寸法決めは、別の話題ではなくコントラスト予算の一部です。

デザイン上の数値と、カメラに届く数値は別物である

デザインファイルとイメージセンサーの間にあるものはすべてコントラストを削り、その損失は打ち消し合わずに積み重なります。推奨値がデコーダーの下限の6倍上に置かれている理由はまさにこれで、要約ではなく項目として並べる価値があります。大半の項目は直せるもので、その対処は安価だからです。

  • 紙は白くありません。 非塗工のオフィス用紙やオフセット用紙が反射するのは、当たった光のおよそ80〜90%です。21:1というデザイン上の比率は、21:1のまま届くことはありません。インクが一滴載る前に、その用紙が許す値になって届きます。
  • インクは広がります。 吸収性の高い用紙では暗いモジュールが隣の明るいセルへ育ち、デコーダーが測るあらゆるブロックの中で、最も暗い値を上げ、最も明るい値を下げます。クラフト紙、新聞用紙、感熱レシート紙が最悪です。
  • 光沢とラミネートは両方に光を足します。 正反射は暗いモジュールにも明るいモジュールにも同じ量の白色光を載せ、黒レベルを持ち上げて比率を圧縮します。コントラストの式に含まれるフレア項とまったく同じ理屈です。マットのラミネートは鮮鋭度をわずかに犠牲にしますが、その代償以上のコントラストを取り戻します。
  • 環境光も同じことをします。 日中の店頭ウィンドウの下にあるコードには、ベーリンググレアが被さります。薄暗いレストランのコードでは、カメラがセンサーのゲインを上げ、二値化器が測るまさにその量にノイズを加えます。
  • 自動露出はコードではなくフレームに合わせられます。 大半が暗い写真の中の小さな明るいラベルに載った暗いコードは、暗い部分に露出が合わされ、ラベルは白に張り付き、モジュールも一緒に引き上げられます。
  • ブレは乗数です。 ピントのずれと手ブレは各ピクセルを近傍と平均化し、平均化こそが8×8ブロック内の最明から最暗までの幅を減らすものです。低コントラストとわずかなブレは足し算ではなく掛け算で効きます。だから際どいコードは、スマートフォンを支えれば読めて、支えなければ失敗するのです。

画面には画面なりの同じリストがあり、ディスプレイは管理された環境だと思っている人を驚かせます。日なたで輝度20%のスマートフォンが、マットな保護フィルム越しに、ダークモードのフィルターを適用したブラウザーの中でコードを表示しているとき、そこにデザインファイルどおりの比率は届いていません。デザイン上の比率は到達可能な上限であって、届く値では決してありません。

ですから「スマートフォンにはどれだけのコントラストが必要か」への答えは、スマートフォンに必要な量はごくわずかで、ワークフローに必要な量は多い、ということになります。あなたが確保しようとしている余裕は、デコーダーに対する余裕ではありません。上の8つに対する余裕であり、そのどれも、判断が下されるモニターの上では見えないのです。

コントラストの階段:自分の数値を得るためのテスト

特定の仕事におけるコントラストの下限を知る方法は、同じコードをコントラストの異なる8段階で実際の素材に印刷し、どこで機能しなくなるかを記録することです。所要は約20分、費用は紙1枚、そして得られるのは他人のためではなく、あなたのプリンター、あなたの用紙、あなたの顧客のスマートフォンのための数値です。

以下の8段は白地の上のグレーで、それぞれがきりのよいコントラスト比になるよう選んであります。同じペイロードを前景色ごとに8回生成し、背景は純白のまま、モジュール形状とサイズは8つすべてで同一に保ち、示した順に1枚の紙へ並べてください。

白地の上の前景色コントラスト比輝度差(255段階中)反射率差
#00000021:1255100%
#5959597.0:116690%
#7F7F7F4.0:112879%
#9494943.0:110770%
#A3A3A32.5:19263%
#B7B7B72.0:17253%
#D2D2D21.5:14536%
#E7E7E71.24:12420%
3つの列、3つの指標、そして各行にはひと組の色。「どのコントラストで失敗するのか」に単一の答えがない理由は、まさにこれです。比率はデザインツールが表示する知覚上の数値、輝度差はカメラのグレーチャンネルにおおよそ届く量、反射率差はバーコード検証機が採点する量です。3つとも16進値から計算されているので、電卓があれば再現できます。
  1. 8段を最終サイズで、最終的な用紙に印刷する. 1枚の紙に、8つのコードすべてを実物と同じサイズで、実際の仕事で使う素材に印刷します。クラフト紙、ボトルのラベル、メニューカードに載る仕事なら、コピー用紙へのオフィスレーザー印刷はテストになりません。インクの広がりは素材によって変わり、色と同じ予算から差し引かれます。
  2. 2台のスマートフォンで、標準カメラだけで全段を読む. iOSとAndroidを1台ずつ、読み取りアプリではなく内蔵のカメラアプリを使います。専用の読み取りアプリは標準カメラより寛容で、顧客には読めない段を通してしまいます。どちらかのスマートフォンで最初に失敗した段を記録してください。
  3. コードが実際に置かれる照明の下で繰り返す. 同じ紙を実際の場所へ持っていきます。レストランのテーブル、店の棚、夕暮れの屋外看板です。照明は他のどの単独要因よりも多くの段だけ失敗点を動かし、そして省かれるのがこの手順です。
  4. 実際の距離と実際の角度で繰り返す. 人が実際に立つ位置から読み、さらに正対から約30度傾けて1回読みます。距離はモジュールあたりのピクセル数を減らし、各ブロックが見る差を縮めます。角度は同じものをもう少し削ります。
  5. スマートフォンを支えずに繰り返す. 雑な持ち方で、片手で、動かしながら持ちます。ブレは各ブロック内の最明から最暗までの幅を減らすため、この回は丁寧な回より1段早く失敗するのが普通です。雑なほうの数値が本当の数値です。
  6. 最初に失敗した段の2段上で設計する. すべての条件の中で最悪の結果を取り、そこから階段を2段上がります。2段というのは、このテストに含められなかった変数のための実務的な余裕です。別のスマートフォン、より寒い日、摩耗した印字ヘッド、サンプルにはなかったラミネートなどです。

1段だけ注記が要ります。#000000の行はテストではなく対照です。その紙で白地の黒が失敗するなら、原因はサイズ、ピント、映り込み、あるいはクワイエットゾーンであり、それが直るまで階段の下の段は何も教えてくれません。

色はコントラストではなく、2つの指標は食い違う

ある色のコントラスト比は、その色がカメラ上でどう振る舞うかの予測子としては当てになりません。2つの数値の成り立ちが違うからです。コントラスト比とは、2つの色の相対輝度を比較する単一の数値で、同一の2色の1:1から、白に対する黒の21:1までの範囲を取ります。これは知覚輝度のうち緑を71%と重み付けし、ガンマ曲線を適用し、暗い組み合わせを意図的に不利にする小さなフレア項を加えます。カメラのグレーチャンネルは緑を59%、赤を30%、青を11%と重み付けし、何も加えません。

白地の上の色コントラスト比輝度差(255段階中)
黒 #00000021:1255
ディープネイビー #0F172A17.9:1232
ダークレッド #7F1D1D10:1197
純青 #0000FF8.6:1226
ブランドブルー #1D4ED86.7:1176
ウェブグリーン #0080005.1:1180
赤 #DC26264.8:1163
純赤 #FF00004.0:1179
緑 #16A34A3.3:1144
マゼンタ #FF00FF3.1:1150
オレンジ #FF7F002.5:1104
アンバー #F59E0B2.2:188
純緑 #00FF001.4:1105
シアン #00FFFF1.25:176
黄 #FFFF001.07:129
コントラスト比はWCAGの相対輝度の式、輝度差はカメラのグレーチャンネルが基づくBT.601の重み付けを使っています。どちらの列も、1列目の16進値から計算したものです。

純青は際立っており、この表で有用な発見です。8.6:1、輝度差226という値は、どちらの指標でもほぼ黒に次ぐ2位であり、深い青をQRコードにとって最も安全な高彩度色として大きく引き離しています。深い赤や深いプラムがそれに続きます。彩度の高さではなく暗さから比率を得ている色は、どれもよく振る舞います。そこにどの配色が残り、どこで使えるのかはカラーQRコードで扱っています。

純緑は2つの指標が最も乖離する場所であり、それでも比率のほうを信じる価値がある場所です。1.4:1という比率は壊滅的に見えますが、輝度差105はオレンジの104と並びます。つまりカメラは、比率が示すより多くを緑のコードに見ています。それでも十分ではありません。255段階中105は、紙と光とレンズが取り分を持っていく前の時点ですでに半分を切っており、緑のコードはモックアップでは確実に動き、棚では失敗するコードの代表です。

黄、シアン、アンバーはどちらの指標でも失格で、これらを救う技法はありません。白地の黄は、カメラに255段階中29段階の差しか与えません。ZXingが境界を探すことをやめる24をかろうじて上回る程度です。黄色いコードは危ういコードではなく、完璧な条件でときどき読み取れる装飾品です。

ブランドカラーが目標に届かないときの対処はいつも同じで、向きも常にひとつです。コードを暗くするのであって、背景を明るくするのではありません。反射率差が印刷を生き延びるには背景が白に近くとどまる必要があり、ブランドカラーは2〜3段暗くしても、たいていは同一性を保ったまま比率を倍にできます。それが受け入れられない場合は、ブランドカラーをコードの周囲の枠、ラベル、行動喚起に置き、コード自体は暗いままにしてください。ブランドQRコードの大半はこれであり、コントラストの費用はまったくかかりません。

暗い背景に明るいモジュールは別の問題である

反転したQRコード、つまり暗い背景に明るいモジュールを置いたコードは、完璧なコントラスト比を持ちながら失敗しうるものです。比率は対称ですが、デコーダーは対称ではないからです。黒地の白は、白地の黒と同じ21:1と計算され、どんなコントラストチェックもこれを警告しません。変わるのは、受け取る側のソフトウェアが画像を両方の向きで試す気があるかどうかです。

現行のiPhoneとAndroidのカメラアプリは、おおむね反転コードを扱え、この点は着実に改善してきました。壊れるのは古いハードウェアです。固定式イメージャー、POSスキャナー、倉庫用機器はしばしば明るい背景に暗いデータが載ることを前提としており、反転処理を持ちません。ZXing自身も、呼び出し側のアプリケーションが提供された反転輝度ソースで画像を包んだときにだけ反転します。これはコードではなく、アプリを作った人が下す判断です。

実務上の規則は、反転はコードの性質ではなく読み取り側への賭けだ、ということです。ポスター、画面、スマートフォンで読まれるSNSの投稿なら、反転コードは妥当なデザイン上の選択です。顧客が未知の機器で読み取るかもしれないもの、あるいはレジで読まれるものでは、美観のために行うコイン投げになります。安全な版、つまり暗い背景の上に明るいパネルを置き、その中に暗いコードを収める形は、四角形1つで済みます。

もうひとつ名指しする価値のある非対称があります。画面上では見えないからです。暗い背景に明るいコードを印刷するということは、広いベタの暗い面を敷くということであり、ベタの被覆は疎な被覆よりも大きく広がります。縮むのは明るいモジュールのほうであり、それはデコーダーが組のうち明るい側として読んでいるモジュールです。したがって反転したコードは、同じコードを通常の向きで刷った場合より、印刷でより多くのコントラストを失います。

印刷規格が比率の代わりに測っているもの

QRコードの世界には独自のコントラスト指標があり、それは比率ではありません。シンボルコントラストとは、ISO/IEC 15415がシンボル内で最も明るい点と最も暗い点の反射率の差として定義する、印刷品質の指標です。パーセントポイントで表され、AからFまでで採点されます。検証機はこれをモジュレーション、固定パターン損傷、グリッド不均一性、未使用誤り訂正と並べて報告し、シンボルの総合等級はそれらのうち最も悪いものになります。

この区別が重要なのは、反射率差とコントラスト比が同じものの印象違いではないからです。反射率は線形の光であり、コントラスト比はその上にガンマ曲線とフレア項を適用します。計算してみると乖離は大きく、小売の仕様で一般に求められる40%の反射率差は、理想的な白に対してコントラスト比にしておよそ1.6:1、70%の差でおよそ3:1に相当します。ウェブのアクセシビリティチェッカーが即座に却下する色の組み合わせが、完全に適合したバーコードでありうるということです。

これは3:1で設計してよいという許可ではありません。2つの業界が食い違う理由の説明です。検証機は、管理された光の下、一定の距離で、シンボルが開口部を満たした状態の印刷サンプルを測ります。一方でデザイナーの比率は、ポケットに入ったスマートフォンを生き延びなければなりません。規格は成果物そのものを測っており、比率は連鎖全体の代理として使われているのです。

規格の内側にある罠は、それが使う光です。バーコード検証は660ナノメートルの赤色照明の下で行われます。初期のレーザースキャナーが使い、現代の検証機も今なお模倣している波長です。シンボルの等級は、4.0/20/660のようにその値とともに表記されます。赤いインクは赤い光を反射するため、白い紙の上の赤いコードは660 nmではほとんどコントラストを持たず、どのスマートフォンでも完璧に読めるのに読み取り不能として採点されます。赤いQRコードがデザイナーの行うあらゆるチェックを通過しながら、レジや倉庫のイメージャーで失敗する具体的な理由が、これです。

そこから導かれる規則です。顧客ではなく固定設備が読むものはすべて、その機器のドキュメントが求めるサイズで、白地に黒とし、目視ではなく検証すべきです。スマートフォンが読むものには、上の表が除外する部分を除いた色空間のすべてが使えます。

設計の目標にすべき数値

印刷するものには最低7:1、画面に表示するものには最低4:1のコントラスト比を目指し、モックアップでどれだけよく見えようと、3:1をそれ以下では出荷しない点として扱ってください。これらは前の各節で挙げた損失をすでに織り込んだ設計目標であり、誰かがスマートフォンで測ったしきい値ではありません。

  • 管理されない条件での印刷、つまりメニュー、パッケージ、サイン、ステッカー。 7:1以上。白地の黒あるいはほぼ黒は21:1で、費用はゼロです。21:1と7:1の隔たりが、ブランドカラーの入る場所です。
  • 吸収性の高い用紙や扱いにくい素材への印刷、つまりクラフト紙、新聞用紙、レシート、布、彫刻面。 コントラストはまったく使わないでください。手に入る中で最も明るい背景に黒とし、予算はモジュールサイズに回します。
  • 画面、つまりウェブサイト、プレゼンテーション、アプリ画面、動画。 4:1以上。ただし閲覧者の輝度設定と環境光は制御できないという前提で。
  • 固定式スキャナーが読むもの、あるいは仕様に従うもの。 白地に黒、そして検証済みで。ここでは色は利点のないリスクであり、赤は固有の失敗モードを持つリスクです。
  • 3:1未満。 出荷しないでください。一部のスマートフォンなら何とかなる際どいコードではなく、紙が選ばれる前に余裕を使い切ったコードです。

忘れやすい確認がひとつあります。3つの角のマーカーも数に入るということです。スキャナーは何かをデコードする前に位置検出パターンでQRコードを見つけますから、モジュールが暗く、角だけが淡いアクセントカラーで置かれたコードは、失敗が回復不能な場所にちょうど最も弱いコントラストを置いていることになります。どのツールを使うにせよ、角の色を背景に対して別に評価し、2つの数値のうち悪いほうをそのコードの本当のコントラストとして扱ってください。

円形やカスタム形状のQRコードを作れる無料のQRコードジェネレーター KoloQR は、その組を自動で計算します。プレビュー横のバッジがパターン色と角の色それぞれについて背景に対するコントラスト比を報告し、悪いほうを表示し、4:1で合格とします。透明な背景は白として判定します。透明なコードが実際に置かれるのは、たいてい白の上だからです。上の8つのグレーそれぞれで同じペイロードを書き出し、その紙を印刷すれば、ジェネレーターで階段を用意することができます。

ここまでのすべてに対する誠実な限界です。これらの数値のどれも、私たちがテストしていないハードウェアでの読み取りを保証しません。そして特定のスマートフォンについての数値を意図的に公表していないのは、私たちがそれを測っていないからです。階段は、あなたが測れるようにするために存在します。20分と紙1枚が、あなたの仕事にとって真である数値を生みます。それは、この記事のどの数値よりも価値があります。

コントラストが本当の原因ではないとき

コントラストのせいにされるQRコードの大半は、別の4つの理由のどれかで失敗しており、そのどれについてもコントラストを上げて変わるものは何もありません。このリストを先に片づけるほうが階段テストより速く済みます。4つのうち3つは、スマートフォンなしでも目に見えるからです。

  • コードが距離に対して小さすぎる。 印刷でおおむね1モジュール0.4mmを下回ると、色が何であれスマートフォンのカメラは苦戦します。他を調整する前に、まず1モジュールを測ってください。
  • クワイエットゾーンが切り取られている。 ISO/IEC 18004はシンボルの周囲に4モジュールの余白を規定しており、デザイナーがその空間をレイアウトのために取り戻すことは、写真映えするのに決してデコードされないコードの最もよくある原因のひとつです。
  • ワークフローのどこかで画像がJPEGとして保存された。 JPEG圧縮はすべてのモジュールの周囲に淡いリングを生み、二値化器が測るまさにそのブロックの内側で局所的な差を下げます。コントラストの問題に見えて、実はファイル形式の問題です。
  • 映り込み。 光沢ラミネートや天井灯を映す画面は、デザイン上のコントラストをまったく下げません。シンボルの一部に明るい斑点を重ねるだけで、その斑点の下のブロックが差を失い、残りのコードは無事です。スマートフォンを傾ければ直るのが、その見分け方です。

誤り訂正も、否定形でこのリストに属します。レベルをMからHに上げても低コントラストのコードは助かりません。誤り訂正はデコーダーが読み違えたモジュールを修復するものであり、低コントラストはデコーダーがそもそもシンボルを読むこと自体を妨げるからです。復元能力とモジュールサイズのトレードオフは実在する判断ですが、この問題のてこではありません。この問題のてこは、前景を暗くすること、背景を明るくすること、あるいはコードを大きくすることです。

装飾とコントラストは同じ予算から支払われるため、関連して知っておく価値のある失敗があります。装飾的なモジュール形状は正方形モジュールより各セルに載るインクが少なく、低コントラストとまったく同じように、二値化器が測る局所的な差を減らします。カスタムQRコードの形状が実際に支払う代償がその計算を追っており、2つの効果は積み重なります。淡いブランドカラーで装飾されたコードは、ひとつの予算から二重に支出しているのです。

QRコードを作る

無料、アカウント不要、透かしなし。形を選び、ロゴを重ね、コントラストを確かめて、SVG・PDF・EPS・PNGで書き出せます。サブスクリプションの要らない静的コードです。

QRコードを作成

Questions? Answered

設計目標としては、印刷で7:1、画面で4:1、そして3:1をそれ以下では出荷しない線とします。デコーダー自身の下限はそれよりはるかに低く、ZXingはブロック内の最も明るいピクセルと最も暗いピクセルの差が255段階中24になると境界の検出をやめます。およそ1.24:1です。ただしその下限が当てはまるのはきれいなデジタル画像であって、店の照明の下で紙に載ったインクではありません。

AppleもGoogleもしきい値を公表していないため、引用されている具体的な数値はどれも、誰にも検証できない測定値です。どちらのデコーダーも非公開です。読める唯一の参照点はZXingで、きれいな画像ではおよそ1.24:1で断念します。実際の仕事に対する実務的な答えは、コントラストを下げていく階段を印刷し、あなたの用紙・照明・スマートフォンの組み合わせがどこで失敗するかを見つけることです。

画面はデザイン上のコントラストを届けますが、紙は届けないからです。白い用紙が反射するのは100%ではなく80〜90%で、インクは暗いモジュールの隣の明るいセルへ広がり、光沢や環境光がその両方に明るいベールをかけます。デザインファイルで3:1と計算される組み合わせが、カメラには2:1に近い値で届くことがあります。モニターではなく、実際の素材に最終サイズでテストしてください。

その色が単に彩度が高いのではなく暗い色であれば、たいていは使えます。深い青、ネイビー、暗い赤はいずれも白に対して7:1を超え、カメラ上でもよく振る舞います。オレンジ、アンバー、シアン、黄は違い、どの誤り訂正レベルもそれらを救いません。ブランドカラーが届かないときは、背景を明るくするのではなくコードを暗くしてください。あるいはコードを暗いままにして、ブランドカラーはその周囲の枠に置いてください。

現行のスマートフォンなら、たいていは読めます。古いスキャナーや固定式スキャナーでは、読めないことがよくあります。コントラスト比は対称なので、黒地の白は白地の黒と同じ21:1と計算され、どのコントラストチェックも警告しません。変わるのは、読み取り側が画像を反転して試すかどうかです。反転コードは印刷でもより多くのコントラストを失います。ベタの暗い被覆が明るいモジュールへ広がるからです。スマートフォンだけが読み手である場所で使ってください。

グラデーションはたいてい生き延び、写真はたいてい生き延びません。理由は、デコーダーが局所的にしきい値を求めるからです。ZXingは8×8ピクセルのブロックごとに別々の明暗の境界を計算するため、ゆっくり変化する背景ならどこでも局所的な差が保たれます。写真はコードより速く変化するため、シンボルのどこかでモジュールが自分のブロックのしきい値の反対側に落ちてしまいます。

バーコード検証機と多くの固定式スキャナーが660ナノメートルの赤色光の下で読み、赤いインクは赤い光を反射するからです。白い紙の上の赤いコードは、カラーカメラにははっきり見えていても、その波長ではほとんどコントラストを持ちません。これは1次元バーコードの世界から知られている罠で、QRコードにもそのまま当てはまります。固定設備が読み取るものはすべて、白地に黒にすべきです。

白地では、ありません。白地の黄はカメラに255段階中29段階の輝度差しか与えず、ZXingが境界を探すことをやめる24をかろうじて上回る程度で、コントラスト比は1.07:1です。パステルもわずかによいだけです。淡いパレットが要件なら、問題を反転させてください。淡いパネルの中に暗いコードを置けば、パレットもコントラストも保てます。

補えません。そしてこれは最もよくある誤った対処です。誤り訂正が修復するのは誤って読まれたモジュールであり、低コントラストはシンボルが読まれること自体を止めます。修復すべきデータが存在する前に、二値化が起きるからです。さらにレベルをMからHへ上げると同じ印刷幅でシンボルが密になり、すべてのモジュールが縮んで、際どいコードはよくなるどころか悪くなります。

そこでの失敗が回復不能だという意味で、より多く必要です。スキャナーは何かをデコードする前に3つの角マーカーでQRコードを見つけるため、暗いコードに淡い角を組み合わせると、誤り訂正が届かない場所にちょうど最も弱いコントラストを置くことになります。角の色を背景に対して別に評価し、2つの数値のうち悪いほうをそのコードの本当のコントラストとして扱ってください。

KoloQRを選ぶ理由

  • ウェブサイト、メニュー、Wi-Fi、PDF、名刺用のQRコードを作成
  • 色・ロゴ・オリジナルの形をカスタマイズ
  • 高品質なPNG・SVGファイルをダウンロード
  • 印刷にもデジタルにも対応
QRコードを作成
シンプルな黒いQRコードと、同じコードをブランドカラーの円形にデザインし直したもの