SWAPQR← ガイド

ディザリングQRコード:写真がスキャン可能なコードになる仕組み

いわゆる「アート」QRコードの多くは、絵の上にコードを重ねたものです。ディザリングQRコードは別物です。画像は1枚だけで、コードはその粒子の一部になっています。この記事では、コードが実際に必要とするもの、誤差拡散ディザリングの仕組み、2つが1つの正方形を共有できるようにする1つの変更、結果を決める2つの設定、そして失敗する3つのパターンを説明します。

ブラウザでQRコードを作成する →四角を一度だけ印刷。リンク先は後から決める。

QRコードが実際に必要とするものから始める

QRコードはモジュール、つまり暗いか明るいかのどちらかである小さな正方形のグリッドです。その一部は構造的で動かせません。スキャナーがコードを見つけて向きを判定するための角の3つの大きな正方形、それらの間の細い交互線、小さな位置合わせの正方形、フォーマットとバージョンを符号化する帯です。それ以外はすべてデータと誤り訂正バイトです。その誤り訂正が突破口です。最高レベルでは、コードの約30%が破壊されても読み取り機はペイロードを復元できます。つまりコードは完璧である必要はありません。重要な場所では完璧で、それ以外では十分に近ければよいのです。この区別を覚えておいてください。技術全体がそこに依存しています。構造モジュールは触れてはならないものとして扱い、データ領域はカメラが見るスケールで平均的に正しければよいものとして扱います。絵をコードに入れるすべてのジェネレーターはこの30%の予算の一部を使っています。問題はどれだけ慎重に使うか、そしてその代償が目に見えるかどうかだけです。

ディザリングを一段落で

Floyd–Steinbergディザリングはグレースケールの写真を純粋な白黒に変換します。ピクセルを順に走査し、それぞれについて黒と白のうち近いほうを選び、そこで生じた誤差、つまり望んだグレーと出力した値の差を、まだ訪れていない隣接ピクセルに押し出します。重みは右のピクセルに7/16、下の3ピクセルに3/16、5/16、1/16です。各隣接ピクセルは自分の番が来たときにわずかに調整された値から始まるので、誤差は失われず、移動するだけです。出来上がる絵は、局所的な密度が元の明るさに対応する斑点の場になります。中間グレーの領域はおよそ半分が黒い点に、ハイライトは白地にまばらな点に、影は黒地にまばらな白い点になります。離れて見ると、目は斑点を平均して階調に戻すため、すべてのピクセルが2色のどちらかであってもディザリングされた画像は写真として読めます。その平均化は、カメラが小さな印刷物を見るときに行うことと同じであり、この技術が利用しているのはそれです。

トリック

コードをモジュールあたり固定ピクセル数で描画します。SWAPQRは9を使うので、各モジュールは9×9のブロックです。次に、正方形全体にわたって写真をディザリングしますが、1つだけ変更を加えます。コードが特定の値を要求する場所では、閾値処理をしません。ピクセルをコードが必要とする値に強制し、その強制によって生じた誤差を測り、他の誤差とまったく同じように拡散します。この最後の節が発想のすべてです。強制された点は絵の上に描かれるのではなく、周囲のピクセルによって代償が支払われ、それらが補償するように変化します。強制された点は他のすべてと同じごま塩のテクスチャの中に収まるので、目にはそれを区別する手がかりがありません。構造モジュール、つまりファインダー、タイミング、アライメント、フォーマットはベタ塗りで手を触れません。誤り訂正が役立つ前に、スキャナーがコードを見つけなければならないからです。ここで説明した技術は、2026年にディザリングQR生成について執筆したAndrew T.が公開したアプローチに従っています。SWAPQRの実装は彼のソースからの移植ではなく、その説明に基づいて書かれました。

すべてを決める2つのつまみ

第一は、各モジュールのどれだけを強制するかです。中央のピクセルだけを強制すれば絵はほぼ無傷ですが、コードは脆弱です。モジュールあたり1ピクセルが、プリンターからカメラセンサーまでのすべてのリサンプリング段階を生き延びなければなりません。9×9のうち7×7のブロックを強制すればコードは頑丈になり、絵は薄くなります。各モジュールの大部分がベタ塗りになるからです。SWAPQRはこれを「写真 ↔ コード」のバランスとして直接公開しており、「写真」「中間」「コード」の位置があるので、このトレードオフはジェネレーターに隠された定数ではなく、あなたが選ぶものになります。第二は、各モジュールをどれだけ寄せるかです。ディザリングの前に、暗いモジュールのすべてのピクセルを少し暗くし、明るいモジュールのすべてのピクセルを少し明るくします。絵はディテールを保ちつつ、モジュールの平均階調が正しい方向に傾きます。それはカメラが部屋の向こうから小さな印刷コードを見るときに見るものです。この2つの設定が合わさって、結果がかすかなコードを含む写真になるか、かすかな写真を含むコードになるかが決まり、特定の印刷物がその線上のどこに位置すべきかは、どのようにスキャンされるかによります。

失敗する場面と、それでも価値があるか

失敗パターンは3つあり、すべて実在し、どれも謎ではありません。平坦な写真:均一に照らされた単一階調の画像は規則的な市松模様にディザリングされ、それはまさにコードと競合するテクスチャなので、写真には本物の明暗の幅が必要で、それがない場合スタジオは警告します。長いリンク:文字数が増えると同じ正方形の中のモジュールが増え、各モジュールが持てる絵の分が減ります。おおよそバージョン8(49×49モジュール)を超えると写真の居場所がなくなり、短いリダイレクトリンクが解決策です。そして一部の読み取り機での極端な至近距離。これは直感に反するため、このガイドに専用の記事があります。アートコードは常に信頼性とのトレードオフです。コードがデザインの一部であり、誰かが意図的にスキャンする場所、たとえばポスター、アルバムジャケット、パッケージ、名刺では価値があります。非常口の看板には向きません。どの設定であれ、千枚注文する前に印刷物を実際のスマートフォンでテストしてください。スタジオは書き出しボタンの隣で同じことを述べており、本気でそう言っています。

コードの部分ディザリングコードでの扱い理由
ファインダーパターン(角の3つの正方形)ベタ塗り、ディザリングしないスキャナーは何よりも先にコードを見つけて向きを判定しなければならない
タイミングライン、アライメント正方形、フォーマットとバージョンの帯ベタ塗り、ディザリングしない構造的。誤り訂正は見つからないコードを修復できない
データと誤り訂正のモジュール各モジュールの中央ブロックを強制、残りは写真を担うスキャン距離でカメラが見るのはモジュールの平均階調
強制ブロック周辺のピクセル誤差拡散によって補償のためにずらされる局所平均を正しく保ち、強制された点を斑点の中に隠す
クワイエットゾーン明るいまま、手を触れないスキャナーは空の余白を使ってコードの縁を見つける

よくある質問

写真はコードの背後に置かれているだけですか?

いいえ。コードと写真は1回のパスで生成されます。絵はディザリングされ、コードが値を必要とする場所ではピクセルが強制され、その誤差が隣接ピクセルに拡散されます。画像は1枚であり、別の層の上に重ねたものではありません。

なぜモジュールあたり9ピクセルなのですか?

各モジュールが9×9のブロックになり、可変サイズの強制コアを保持しつつ、絵のためのピクセルを残せる大きさだからです。そのブロックのどれだけを強制するかはバランス設定が決めます。

普通のスマートフォンでスキャンできますか?

はい。設計対象のペイロードと画像については可能で、すべてのビルドは2つの独立したデコーダーで7段階のシミュレートされたカメラ距離に対して検証されています。それでも信頼性とのトレードオフなので、1枚印刷して自分のスマートフォンでテストしてください。

長いリンクが絵を台無しにするのはなぜですか?

テキストが長いほどバージョンが上がり、同じ正方形の中により多くの小さなモジュールが入ります。各モジュールが写真ピクセルに使える余地が減り、おおよそ49×49モジュールを超えると絵は消えます。短いリダイレクトリンクを使ってください。

四角を一度だけ印刷。リンク先は後から決める。 SWAPQRは静的QRコードを無料で作成できます。すべてのスタイルオプション付きで、アカウント登録も透かしもありません。有料プランではコードが動的になります。印刷した四角はそのままで、リンク先を変更でき、日別・デバイス別にどれくらいスキャンされたかを確認できます。

ブラウザでQRコードを作成する
言語: TR EN DE ES FR IT PT AR RU JA KO