テキストやURL、Wi-Fiの接続情報からQRコードを作ってPNGで保存できるアプリです。生成はブラウザの中だけで完結するので、入力した内容はサーバーに送られません。
使い方
- タブで種類を選びます(テキスト/URL、Wi-Fi、メール、電話・SMS)。
- 内容を入力すると、その場でQRコードが表示されます。
- 必要に応じて誤り訂正レベルと画像サイズを変えます。
- 「PNGを保存」で画像として保存します。
Wi-Fiタブは SSID・パスワード・暗号化方式を入れると、読み取るだけで接続できるQRコードになります。ステルスSSID(ビーコンを出していないネットワーク)のチェックもあります。読み取り側はAndroidの標準カメラとiOS 11以降のカメラが対応しています。
何に使えるか
来客用のWi-Fiを紙に貼って案内する、手順書やラベルに機器の管理画面のURLを載せる、資料の参考リンクを紙面に載せる、といった用途を想定しています。
誤り訂正レベルは、画面に表示するだけなら M、印刷して現場に貼るなど汚れや欠けが避けられない場所に置くなら Q か H を選びます。レベルを上げるほど復元できる割合は増えますが、同じ内容でもコードは細かくなります。
Wi-Fiの接続情報を貼り出すのは、その場所にいる人全員にパスワードを配るのと同じです。社内向けのSSIDではなく、ゲスト用に分けたSSIDで使ってください。
技術メモ
HTML1枚(CSS・JavaScript込み)で、外部CDNもAPIも使っていません。QRコードのライブラリはCDN配信が多く、CDNが落ちるとアプリも動かなくなるため、JIS X 0510(ISO/IEC 18004)のモデル2をそのまま実装しました。
やっていることは、数字/英数字/8ビットバイト(UTF-8)モードの自動選択、型番1〜40の決定、ガロア体 GF(256) 上のリードソロモン符号による誤り訂正語の生成、8種類のマスクを全部試して減点法で選ぶ処理、形式情報のBCH符号です。GF(256) の乗算は次の8行で、テーブルを持たずに原始多項式 0x11D で都度計算しています。
function gfMul(x, y){
var z = 0;
for (var i = 7; i >= 0; i--) {
z = (z << 1) ^ ((z >>> 7) * 0x11D);
z ^= ((y >>> i) & 1) * x;
}
return z & 0xFF;
}
描画は Canvas で、canvas.toDataURL("image/png") の結果を <a download> に渡して保存しています。
自前実装は間違えても見た目では気づけないので、別実装(Pythonのsegno)と生成した行列を突き合わせて検証しました。全40型番×4レベルの容量ぎりぎりの入力を含む256ケースで完全一致しています。誤り訂正ブロック数の表の写し間違い(型番32以降のHレベルが1つずれていた)は、この照合で見つかりました。
マイクロQRと漢字モードには対応していません。日本語はUTF-8のバイトモードで入るため、漢字モードを使う場合より少しコードが大きくなります。