qrcodeモジュールが提供するmake関数やQRCodeクラスを使ってQRコードを作成する方法を紹介する。また、作成したQRコードの内容を読み取る方法も簡単に紹介する。
# 一番簡単な方法
import qrcode
url = 'https://atmarkit.itmedia.co.jp/ait/series/20263/index.html'
img = qrcode.make(url)
img.save('test.png')
# QRCodeクラスを使う方法
from qrcode import QRCode
url = 'https://atmarkit.itmedia.co.jp/ait/series/20263/index.html'
qr = QRCode()
qr.add_data(url)
qr.make() # QRコードを生成
img = qr.make_image() # QRコードの画像を生成
img.save('test.png')
# オプションを指定する
from qrcode.constants import ERROR_CORRECT_L
qr = QRCode(
version=1, # QRコードのバージョン(セル数)
error_correction=ERROR_CORRECT_L, # 誤り訂正のレベル
box_size=10, # 1セルのピクセル数
border=4 # ボーダーのピクセル数
)
qr.add_data(url)
qr.make()
img = qr.make_image(back_color='white', fill_color='black')
img.save('test.png')
print(qr.version) # 4
# qrcode.make関数でも各種オプションは指定可能
img = qrcode.make(url, version=5, box_size=10, border=4)
img.save('test2.png')
# QRコードの読み取り
import cv2
img = cv2.imread('test.png')
detector = cv2.QRCodeDetector()
data, vertices_array, binary_qrcode = detector.detectAndDecode(img)
print(data) # https://atmarkit.itmedia.co.jp/ait/series/20263/index.html
QRコードは大量の情報を格納可能な2次元コードの規格である*1。誤り訂正機能があることや、さまざまな角度からの読み取りが可能であることなどの特徴を持つ。
*1 「QRコード」は株式会社デンソーウェーブの登録商標です。
PythonでQRコードを生成するモジュールは多数存在するが、ここではqrcodeモジュールを紹介する。qrコードモジュールはPythonには標準で付属していないので「pip install qrcode」「py -m pip install qrcode」などのコマンドラインを実行してインストールしておく必要がある。
このとき以下の点に注意しよう。
qrcode 7.4以降ではPillowモジュールがインストールされていない場合には、pypngモジュールを使って画像を作成できるようになっているので、pillowを別途インストールしなくても構わないが、Pillowの機能を使ってQRコードで何かをしたいのであればインストールしておこう。
qrcodeモジュールにはmake関数がある。QRコードを生成する一番簡単な方法は、この関数にQRコード化したいテキストを渡すだけだ。以下に例を示す。
import qrcode
url = 'https://atmarkit.itmedia.co.jp/ait/series/20263/index.html'
img = qrcode.make(url)
img.save('test.png')
この例では本連載の一覧ページのURLをmake関数に渡している。これによりQR画像が返送されるので、後はsaveメソッドでこれを保存すればよい。
Visual Studio Codeから上記コードを実行して生成したQRコードを以下に示す。
qrcodeモジュールが提供するQRCodeクラスを使ってもよい。以下に例を示す。
from qrcode import QRCode
url = 'https://atmarkit.itmedia.co.jp/ait/series/20263/index.html'
qr = QRCode()
qr.add_data(url)
qr.make() # QRコードを生成
img = qr.make_image() # QRコードの画像を生成
img.save('test.png')
ここではQRCodeクラスのインスタンスを生成し、それにadd_dataメソッドでQRコード化したいテキストを渡し、最後にmakeメソッドでQRコードを生成する。QRコードからその画像を生成するにはmake_imageメソッドを呼び出す(実際にはmakeメソッドでQRコードを生成していなくても、その場合にはmake_imageメソッド内でmakeメソッドが呼び出される)。
qrcode.make関数では上のQRCodeクラスによるQRコードの画像作成と同じことが行われている。
QRCodeクラスとmake関数は幾つかのキーワード引数を受け付ける。以下に抜粋して示す。
QRコードには多量の情報を含めることができる。その情報量に合わせてQRコードを構成する白黒のセル数が変わる。このセル数を決定するのがバージョンである。バージョン1では21×21セルでQRコードが構成されるが、最大のバージョンであるバージョン40では177×177セルでQRコードが構成される。versionパラメーターで指定したサイズのQRコードではデータを収め切れないときには、そのQRコードのバージョンが自動的に決定されているようだ。
また、QRコードは誤り訂正機能を持っており、そのレベルを指定するのにerror_correctionパラメーターを指定する。qrcode.constantsモジュールに誤り訂正のレベルを示す値が定義されているので、必要に応じてそれらを使用すること。
レベル | 訂正能力 | 対応する値(qrcode.constantsモジュール) |
---|---|---|
レベルL | 約7% | ERROR_CORRECT_L |
レベルM | 約15% | ERROR_CORRECT_M |
レベルQ | 約25% | ERROR_CORRECT_Q |
レベルH | 約30% | ERROR_CORRECT_H |
誤り訂正のレベル |
box_sizeパラメーターはQRコードを構成する白黒のセルを何ピクセルで描画するかを指定する。borderパラメーターはQRコードを取り囲む境界線の太さを指定する。
これらのパラメーターを指定する例を以下に示す。
from qrcode.constants import ERROR_CORRECT_L
qr = QRCode(
version=1, # QRコードのバージョン(セル数)
error_correction=ERROR_CORRECT_L, # 誤り訂正のレベル
box_size=10, # 1セルのピクセル数
border=4 # ボーダーのピクセル数
)
qr.add_data(url)
qr.make()
img = qr.make_image(back_color='white', fill_color='black')
img.save('test.png')
print(qr.version) # 4
この例ではversionパラメーターに1を指定しているが、以下の画像を見ると、実際には21×21セルのQRコードにはURLが収まらないため、より大きなバージョンである「4」がこのQRコードでは使われていることが分かる。
また、make_imageメソッドでは背景色(back_colorパラメーター)と描画色(fill_colorパラメーター)も指定可能だ。
make関数ではversion/error_correction/box_size/borderなどのキーワード引数を受け付ける。
img = qrcode.make(url, version=5, box_size=10, border=4)
img.save('test2.png')
ただし、今述べた背景色と描画色を指定するback_colorパラメーターとfill_colorパラメーターはサポートされないので、これらを変更したいのであればQRCodeクラスを使うようにしよう。
最後に作成したQRコードを読み取るコードを紹介だけしておく。ここではopencv-python-headlessモジュールを使用する。事前にこれをpipコマンドなどでインストールしておこう。
後は以下のコードのようにimread関数で作成したQRコード画像を読み込んだら、次にQRCodeDetectorクラスのインスタンスを作成して、そのdetectAndDecodeメソッドに読み込んだ画像を与えるだけだ。簡易的にはこれでQRコードの内容を読み取れる。
import cv2
img = cv2.imread('test.png')
detector = cv2.QRCodeDetector()
data, vertices_array, binary_qrcode = detector.detectAndDecode(img)
print(data) # https://atmarkit.itmedia.co.jp/ait/series/20263/index.html
Copyright© Digital Advantage Corp. All Rights Reserved.