はじめに
QRコードを書き換えて遊ぶ Web アプリを作りました.こちらから.
QRコードには,エラー訂正機能があります.
一部のマスについて,汚れだったり,認識ミスによって黒と白を正しく読み込めなくとも,データを復元することができます.
中央付近にロゴなどの画像がある QRコードは,このエラー訂正の仕組みを悪用利用したものです.
なので,元の QRコードからピクセルを変えていくと,ある程度変えたところで読み込めなくなるか,別の文字列として読み取れるようになるはずです.
これでジェンガのように遊べないかな,と思って QRコードの白黒を書き換えるアプリを作りました. 書き換えた QRコードをデコードした結果を表示します.
わかったこと
適当に白黒を変えていくと,基本的に Checksum Exception になり,読み取れなくなります.
他の文字列になったら面白いな,と思っていましたが偶然他の文字列になることは私の試した限りありませんでした.
QRコードの白黒はランダムにすると基本的に読み取り不可,ということなのでしょう. 読み取れない空間を有効活用できればより小型化したり情報を詰め込めたりする可能性が実はあったりするのでしょうか. でも認識ミスが起こった時に違う文字列として読み取れてしまうよりは読み取り失敗の方がうれしさがありそうですね.
エラー訂正レベルを H にすると,結構書き換えても耐えていて,びっくり.訂正の中身が気になります.どんな仕組みなのだろう.
技術情報
QRコードの読み書きには,ZXing の TypeScript 移植版(GitHub)を用いました.
Canvas 上のピクセルデータを boolean[][] の行列として抽出し,ZXing のデコーダーに直接流し込んでいます.画像認識を経由せず,直接デコードを行っています.
エンコード時に空白を詰めたりする仕様があるようだったので,読み取ったデータをそのまま 16 進数として表示する機能もつけておきました.
おわりに
作成した QRコードを画像としても保存できるようにしたので,ただの QRコードジェネレータとしても使えます.

真っ黒に塗り潰した QRコード,結果は Checksum Exception でした.何かしらの文字列として読めれば面白かったですが.
これでジェンガみたいに遊べはしますが,あんまり面白くないかもと思ったり. 変更した時にデータが壊れやすい領域と壊れにくい領域がありそうなので,戦略性が無いわけでは無い,かも.
QRコードは株式会社デンソーウェーブの登録商標です.