エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。
普段はフリーランスでシステムエンジニアをしております。
今回は、PythonのqrcodeライブラリでQRコードの生成や読み取りを行う方法をまとめてみました。
なお、本記事内のPythonソースコードは、JupyterLabで動作を確認しています。
同様に動作確認したい方はこちらの記事も参照し、まずはJupyterLabの環境構築をおこなうとよいでしょう。
QRコードとは
QRコードとは、「Quick Response」の頭文字からとっており、下図のような素早く情報を読み取ることができる二次元バーコードのことです。
※QRコードは、株式会社デンソーウェーブの登録商標です。
QRコードは、デンソーウェーブ社が開発した技術であり、利用するにあたって手続きや費用が不要、かつオープンソースで公開されているため、様々なシーンに活用されています。
QRコードの仕組み
QRコードの仕組みとしては、「ファインダパターン(切り出しシンボル)」が3点と「アライメントパターン」が1点の計4点で構成されており、カメラでこの4点を含む二次元バーコードを読み込むことができるようになっています。
「ファインダパターン」(finder-pattern)
ファインダーパターンとは、QRコード内の下図の赤枠部分の3点を指します。
「アライメントパターン」(alignment-pattern)
アライメントパターンとは、QRコード内の下図の赤枠部分の1点を指します。
QRコードの大きな特徴として、多少汚れたとしても、誤り訂正機能で正しくコードを読み取れるようになっています。
誤り訂正機能の詳細については、後述しております。
QRコードの使用例
ここでは、現実世界でQRコードが使用されているシーンを紹介します。
- チラシなどにホームページへのリンクとしてQRコードを使ったり
- 物流管理で商品情報、配送先、配送方法、入出荷の登録としてQRコードを使ったり
- 音楽ライブなどのイベントで入退場管理にQRコードが使われたり、
- レジの電子決済でQRコードが使われたり(QRコード決済)
- LINEで友達アカウントをフォローする際にQRコードを使ったり
PythonでQRコードを生成するための事前準備
Anaconda仮想環境を準備
Anacondaのインストールから仮想環境(venv)で外部ライブラリをインストールする方法については、以下の記事を参考に用意します。
JupyterLab開発環境を準備
JupyterLab(ジュピターラボ)のインストールから使い方については、以下の記事を参考に環境を構築してください。
Pythonのqrcodeの使い方
事前準備ができたところで、PythonでQRコードを扱うためのqrcodeライブラリの導入方法および使い方を紹介していきます。
Python 画像ライブラリPillowをインストール(pip install Pillow)
Anaconda NavigatorのEnvironmentsメニュー、またはAnaconda Promptから仮想環境に画像ライブラリのPillowをインストールします。
1 |
pip install Pillow |
または
1 |
pip3 install Pillow |
Python QRコード生成ライブラリqrcodeをインストール(pip install qrcode)
先程と同様にAnaconda NavigatorのEnvironmentsメニュー、またはAnaconda Promptから仮想環境にQRコード生成ライブラリのqrcodeをインストールします。
1 |
pip install qrcode |
または
1 |
pip3 install qrcode |
qrcode.QRCodeクラスオブジェクトの生成と設定パラメータ
PythonでQRコードを生成する場合、qrcodeライブラリのQRCodeクラスオブジェクトを使って操作を行います。
細かいカスタマイズをしたい場合は、このQRCodeクラスオブジェクトを生成する際にオプションでサイズやバージョン、誤り訂正レベル等をパラメータ指定します。
本章では、代表的なパラメータについて、解説していきます。
box_sizeパラメータ
box_sizeパラメータは、QRコードの各ボックスのピクセル数を設定することができます。
1 2 3 4 5 6 |
qr = qrcode.QRCode( version=10, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=2, border=8 ) |
borderパラメータ
borderパラメータは、境界線の太さを設定することができます。
デフォルトでは、最小値の4が設定されています。
1 2 3 4 5 6 |
qr = qrcode.QRCode( version=10, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=2, border=8 ) |
versionパラメータ
versionパラメータは、QRコードのバージョンを1~40の間で指定することができます。
versionパラメータの値によって、QRコードの大きさが変わります。
1 2 3 4 5 6 |
qr = qrcode.QRCode( version=10, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=2, border=8 ) |
たとえば、versionが1の場合、21 x 21のマトリックスのQRコードになります。
error_correctionパラメータ
error_correctionパラメータは、QRコードの大きなメリットである誤り訂正の制御を行います。
qrcodeライブラリの誤り訂正の制御では、以下のレベルを指定することができます。
- ERROR_CORRECT_L:約7%以下の誤りを訂正
- ERROR_CORRECT_M:約15%以下の誤りを訂正
- ERROR_CORRECT_Q:約25%以下の誤りを訂正
- ERROR_CORRECT_H:約30%以下の誤りを訂正
デフォルトでは、ERROR_CORRECT_M となっています。
1 2 3 4 5 6 |
qr = qrcode.QRCode( version=10, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=2, border=8 ) |
パラメータの紹介ができたところで、次はqrcodeライブラリに含まれるメソッドを紹介していきます。
add_dataメソッドでデータ設定
QRコードを読み取ったときのデータをセットするには、add_dataメソッドを使用します。
1 |
qr.add_data('https://www.python.org/') |
ここでは、本サイトのURLアドレスをデータとしてセットしています。
make_imageメソッドでQRコードを生成
QRコードを生成するには、make_imageメソッドを使用します。
1 |
img = qr.make_image(fill_color="black", back_color="white") |
戻り値がPillowライブラリのImageオブジェクトであるため、showメソッドでQRコードを確認したり、saveメソッドで保存することが可能です。
なお、make_imageの引数でボックスの色と背景色を指定しています。
ボックスの色と背景色は、以下のようにRGBでも指定することができます。
1 |
img = qr.make_image(fill_color="black", back_color="#ffffff") |
showメソッドでQRコードを表示
QRコードを表示するには、showメソッドを使用します。
1 |
img.show() |
saveメソッドでQRコードを画像ファイルで保存
QRコードを画像ファイルとして保存するには、saveメソッドを使用します。
1 |
img.save("sample.png") |
引数には、画像のファイル名を指定します。
PythonでQRコード作成(サンプルコード付き)
ここでは、QRコードを生成するサンプルコードについて、いくつか紹介していきます。
まずは、前述したqrcodeの使い方から以下のようにコードを書くと、QRコードを生成したり、表示したりすることができる基本的なサンプルコードができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import qrcode from PIL import Image qr = qrcode.QRCode( version=10, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=2, border=8 ) qr.add_data('https://engineer-lifestyle-blog.com/') qr.make() _img = qr.make_image(fill_color="black", back_color="#ffffff") _img.save('qrcode.png') img = Image.open('qrcode.png') img.show() |
上記サンプルコードは、本サイトのトップページのURLをQRコード化したものです。
次は、QRコードを画像中に埋め込んだり、QRコード中に画像を埋め込む方法を紹介していきます。
QRコードを画像中に埋め込む場合
添付図のようにQRコードを画像中に埋め込むサンプルプログラムを紹介します。
今回のサンプルプログラムでは、画像の右下にQRコードを埋め込む例を記載しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import qrcode from PIL import Image bg_img = Image.open('notebookpc.png') qr = qrcode.QRCode(box_size=10) qr.add_data('https://engineer-lifestyle-blog.com/') qr.make() qr_img = qr.make_image() pos = (bg_img.size[0] - qr_img.size[0], bg_img.size[1] - qr_img.size[1]) bg_img.paste(qr_img, pos) bg_img.save('qr_on_image.png') |
QRコードを埋め込む場所は、11行目のpos変数の右辺を編集すると、任意に変更することができます。
また、QRコードのサイズについても、前述のとおりbox_sizeオプションの値を調整することでサイズ変更が可能です。
QRコード中に画像を埋め込む場合
次は、添付図のようにQRコード中に画像を埋め込むサンプルプログラムを紹介します。
今回のサンプルプログラムでは、画像の特定部分を切り取った後、QRコードの中央に切り取った画像を埋め込む例を記載しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import qrcode from PIL import Image face_img = Image.open('notebookpc.png').crop((300, 300, 600, 450)) qr_img = qrcode.QRCode( error_correction=qrcode.constants.ERROR_CORRECT_H ) qr_img.add_data('https://engineer-lifestyle-blog.com/') qr_img.make() conv_qr_img = qr_img.make_image().convert('RGB') pos = ((conv_qr_img.size[0] - face_img.size[0]) // 2, (conv_qr_img.size[1] - face_img.size[1]) // 2) conv_qr_img.paste(face_img, pos) conv_qr_img.save('image_on_qr.png') |
画像の特定部分を切り取る処理は、4行目のcropメソッドで行っています。
cropメソッドの第一引数、第二引数が、画像の左上の頂点のx, y座標を示します。
同様に
cropメソッドの第三引数、第四引数が、画像の右下の頂点のx, y座標を示します。
画像を埋め込む場所は、13行目のpos変数の右辺を編集すると、任意に変更することができます。
ただし、QRコードの誤り訂正機能がどこまで働くかによって読み取り可、読み取り不可が決まってくるので、QRコード中に画像を埋め込むことは推奨されておりません。
PythonでQRコード読み取り(サンプルコード付き)
次は、Pythonで画像中のQRコードを読み込むサンプルプログラムを紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import sys from pyzbar.pyzbar import decode from PIL import Image, ImageGrab def qrdecode(img): for x in decode(img): print(x[0].decode("utf-8")) if len(sys.argv) == 1: qrdecode(ImageGrab.grabclipboard()) else: for arg in sys.argv[1:]: qrdecode(Image.open(arg)) |
QRコードを読み込むライブラリpyzbarをインストール(pip install pyzbar)
PythonでQRコードを読み込むには、前述した画像読み込むPillowに加えて、QRコードを読み込むpyzbarをpipでインストールします。
1 |
pip install pyzbar |
QRコードを読み込む方法
先程のqrdecode.pyを実行するときに引数として画像ファイルを指定して実行すると、QRコードを読み込むことができます。
ここでは、前章で作成した「qr_on_image.png」画像ファイルを読み込み、画像中のQRコードの情報を取得できるか確認しています。
【コマンド例】
1 |
python qrdecode.py qr_on_image.png |
【コマンド例の実行結果】
1 |
https://engineer-lifestyle-blog.com/ |
「qr_on_image.png」画像ファイルの右下に含まれるQRコードをデコードしたサイトURLが取得できていることが確認できます。
まとめ
いかがでしたでしょうか。
PythonでQRコードを生成したり、QRコードの読み取り方を紹介してきました。
最近では、QRコード決済等も主流になってきているため、具体的にイメージもしやすかったのではないでしょうか。
本記事を通してPythonを使えばQRコードを簡単に扱うことができ、アプリを作成する手助けになればと思います。
【関連記事】
【TIPS】PythonでのCSVファイル読み込み、書き込み操作まとめ
【TIPS】データ分析ならコレ!Python Pandas使い方まとめ(DataFrame編)