QRコードを扱う

QRコードを出力したり、読んだりしてみた備忘録。

QRコードで自分自身にアクセスさせる

PCでスマホ対応のWebサイトを開発していた。PCに簡易のWebサーバーを立てて、そこにアクセスする形で実機のスマホでの確認をしたくなる事がある。

そんな時、PC側のアドレスをQRコードで表示させ、そのQRコードをスマホのカメラで読み取る事でアクセスできると、アドレスを手打ちする必要がなくなる。今回はそれを実現したいと思った。

標準入力からデータを取得し、QRコードを生成した後、ターミナルエミュレータ上にそれを表示する。

"""
Dependencies:
- pip install qrcode[pil]
"""
import sys

import qrcode

data = sys.stdin.read().strip()
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=1,
    border=4,
)
qr.add_data(data)
qr.make(fit=True)
print("\033[H\033[J")  # Clear display
qr.print_tty()

画像で表示したい場合は qr.print_tty() するのではなく、以下のようにする。

qr_terminal = qr.make_image(fill_color="black", back_color="white")
qr_terminal = qr_terminal.resize((qr_terminal.size[0] * 2, qr_terminal.size[1] * 2))
    
qr_terminal.show()

QRコードを読み取る

zbarを使う事で、QRコードをCLIで処理できる。

zbarをインストールする。

brew install zbar

PNG形式のファイルを読み込み、データを出力する。

zbarimg --raw -q example-qr.png

リージョンの範囲の文字列をQRコードにする

;;;###autoload
(defcustom qrcode-python-executable "python"
  ""
  :group 'qrcode
  :type 'string)

;;;###autoload
(defcustom qrcode-python-print-qr-script "printqr.py"
  ""
  :group 'qrcode
  :type 'string)

;;;###autoload
(defun qrcode-as-region (&optional beg end)
  (interactive "r")
  (async-shell-command
   (format  
    "echo '%s' | %s %s"
    (buffer-substring-no-properties beg end)
    qrcode-python-executable
    qrcode-python-print-qr-script)))
    
(provide 'qrcode)
;; qrcode.el ends here