実は、今年から学生になりました。学校の課題が多くなかなか技術的な内容をまとめられていなかったのですが、ふとした頼まれごとでPythonを使用してQRコードのPNG画像を生成するという作業があったので、忘れると嫌なので使い方などをメモしておきます。
Wikipediaによると…
QRコード(キューアールコード)は、1994年(平成6年)に日本・愛知県の自動車部品メーカーであるデンソーの開発部門(現在は分社化してデンソーウェーブ)が発明したマトリックス型二次元コードである。データ読み取りや店頭決済用コードとして世界中で多用されている。
以下サイトはデンソーウェーブさんのQRコードについてのサイトになります。
このサイトかなり詳しい情報が載っているので興味深いです。
QRコードの特許に関して
特許に対しても以下の様になっているようです。
特許権者のデンソーウェーブは、まずはQRコードが普及するよう敢えて特許をオープンにすることとし、規格化された技術に対して特許権を行使しないと宣言している(Wikipediaより)
公式のFAQも参考にしてください。
QRコードを生成するためのライブラリ
QRコードを生成するライブラリ名はズバリqrcode
となります。
pipコマンド
でインストールを行う場合には以下の様になります。venv環境では問題なくインストールできますが、最近のLinuxなどではPEP668のアラート
が出るので参考のリンク内容確認して設定を行ってください。
$ pip install qrcode
【エラーがでたときの参考】
上記のインストール方法では、pypng
ライブラリ を使用してPNG画像を作ります。QR コードをコンソールに直接レンダリングすることもできます。
ただ、より多くの画像処理を行うには、pillow
ライブラリの依存関係を含むqrcode
をインストールします。
$ pip install "qrcode[pil]"
あとは、QRコードの生成を行っていきます。まずはPythonのコードで行っていきます。
Pythonを使用してQRコードを作成する
実際に使用するには以下のようにコードを記述します。
import qrcode from PIL import Image img = qrcode.make("Hello World!") img.save('helloworld.png')
実行例
生成されたPNG画像を読取るとHello World!
と表示されます。長い文字列を入れる事ができることもQRコードの利点として挙げる事ができます。
URLのリンクを使用する際にはmakeメソッド
の引数にURLを格納することになります。
import qrcode from PIL import Image img = qrcode.make("https://example.com/") # URLにします img.save('helloworld.png')
実行例
高度な生成方法
基本先ほどまで使用方法で問題はないのですが、少し高度なことを行わないといけない場合にはQRCodeメソッド
を使用します。これにより生成したQRコードの形式、エラー訂正、サイズ、余白などを制御することができます。また、make_imageメソッド
を使用することで、単なる白黒ではなく、別の色でのQRコードを使用することができます。この場合にはカメラなどの光の関係で認識率が下がってしまう点には注意です。
import qrcode qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) qr.add_data("https://example.com/") qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") img.save('qrcode.png')
実行例
エラー訂正パラメータ | 内容 |
---|---|
ERROR_CORRECT_L | 約7%以下の誤差は修正可能 |
ERROR_CORRECT_M(デフォルト) | 約15%以下の誤差は修正可能 |
ERROR_CORRECT_Q | 約25%以下の誤差は修正可能 |
ERROR_CORRECT_H | 約30%以下の誤差は修正可能 |
このライブラリでは生成されたPNG画像はモノクロフォーマットになりますが、インデックスカラー(パレット)やフルカラーなどのPNG画像にする場合にはpillowライブラリ
の力を借ります。
最終行のimg = qr.make_image()
の部分を以下のように変更するとインデックスカラー形式に変更することができます。
img = qr.make_image(fill_color="black", back_color="white").convert('P')
また、PNG画像ではなくSVGの出力にも対応をしています。SVGフォーマットにもいろいろな出力形式にも対応しているようなので、ドキュメントをご確認ください。
import qrcode import qrcode.image.svg img = qrcode.make(”https://example.com/”, image_factory=qrcode.image.svg.SvgImage) # image‗factoryへ形式を指定 img.save('qrcode.svg')
コマンドラインでの実行
pipコマンドでのインストールを行うとCLI上からも変換できるようになります。
# PNG版 $ qr ”https://example.com/” > url.png # SVG版 $ qr --factory=svg ”https://example.com/” > url.svg
実行例
おわりに
比較的よく使っていたQRコードですが、Pythonでも比較的簡単に作ることができるようになりました。
自分は勉強会のコミュニティ活動をしています。Xへポストを促すことで、コミュニティイベントの盛り上がりを見せるために、イベント説明のスライドにQRコードを張り付けてポストを促しています。
以下のようなテキストをQRコード化することで
http://twitter.com/intent/tweet?text=hello&url=http://example.com
投稿編集画面に一気に行けるのでかなり便利です。そこで、こちらをqrcodeライブラリを使用してCLIで実行できるようにしました。 引数としては第1引数はポストするコメント、第2引数はURL(省略可能)、第3引数は生成されたQRコードPNG画像のファイル名となっています。 ※引数には"#"などがはいることもあるのでダブルクオーテーションで囲みます。
実行例
これでバッチリですね!