Pythonで深堀り!QRコードの生成方法を理解する!

実は、今年から学生になりました。学校の課題が多くなかなか技術的な内容をまとめられていなかったのですが、ふとした頼まれごとでPythonを使用してQRコードPNG画像を生成するという作業があったので、忘れると嫌なので使い方などをメモしておきます。

Wikipediaによると…

ja.wikipedia.org

QRコード(キューアールコード)は、1994年(平成6年)に日本・愛知県の自動車部品メーカーであるデンソーの開発部門(現在は分社化してデンソーウェーブ)が発明したマトリックス二次元コードである。データ読み取りや店頭決済用コードとして世界中で多用されている。

以下サイトはデンソーウェーブさんのQRコードについてのサイトになります。

www.qrcode.com

このサイトかなり詳しい情報が載っているので興味深いです。

QRコードの特許に関して

特許に対しても以下の様になっているようです。

特許権者のデンソーウェーブは、まずはQRコードが普及するよう敢えて特許をオープンにすることとし、規格化された技術に対して特許権を行使しないと宣言している(Wikipediaより)

公式のFAQも参考にしてください。

www.qrcode.com

QRコードを生成するためのライブラリ

QRコードを生成するライブラリ名はズバリqrcodeとなります。

pypi.org

github.com

pipコマンドでインストールを行う場合には以下の様になります。venv環境では問題なくインストールできますが、最近のLinuxなどではPEP668のアラートが出るので参考のリンク内容確認して設定を行ってください。

$ pip install qrcode

【エラーがでたときの参考】

uepon.hatenadiary.com

上記のインストール方法では、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画像のファイル名となっています。 ※引数には"#"などがはいることもあるのでダブルクオーテーションで囲みます。

XにポストするQRコードを作成

実行例

これでバッチリですね!

/* -----codeの行番号----- */