検索
連載

[解決!Python]qrcodeモジュールを使ってQRコードを作成するには解決!Python

qrcodeモジュールが提供するmake関数やQRCodeクラスを使ってQRコードを作成する方法を紹介する。また、作成したQRコードの内容を読み取る方法も簡単に紹介する。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「解決!Python」のインデックス

連載目次

# 一番簡単な方法
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


qrcodeモジュールによるQRコードの作成

 QRコードは大量の情報を格納可能な2次元コードの規格である*1。誤り訂正機能があることや、さまざまな角度からの読み取りが可能であることなどの特徴を持つ。

*1 「QRコード」は株式会社デンソーウェーブの登録商標です。


 PythonでQRコードを生成するモジュールは多数存在するが、ここではqrcodeモジュールを紹介する。qrコードモジュールはPythonには標準で付属していないので「pip install qrcode」「py -m pip install qrcode」などのコマンドラインを実行してインストールしておく必要がある。

 このとき以下の点に注意しよう。

  • qrcode 7.3.1まではPillowモジュールもインストールしておく必要がある。これには「pip install "qrcode[pil]"」「py -m pip install "qrcode[pil]"」などのコマンドラインを実行するか、「pip install pillow」「py -m pip install pillow」などのコマンドラインを別途実行する
  • venvモジュールで作成した仮想環境下でqrcodeモジュールをインストールして使おうとすると、「ModuleNotFoundError: No module named 'pkg_resources'」というメッセージが表示され、思ったように動作しないことがある。これを回避するには「pip install setuptools」「py -m pip install setuptools」などのコマンドラインを実行しておく

 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コードを以下に示す。

作成したQRコード画像
作成したQRコード画像

QRCodeクラスを使った方法

 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関数は幾つかのキーワード引数を受け付ける。以下に抜粋して示す。

  • version:QRコードのバージョン(セル数)の指定。1〜40の整数値
  • error_correction:誤り訂正のレベルの指定
  • box_size:1セルを何ピクセルで表すかの指定
  • border:QRコードの境界線の太さを指定

 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コードでは使われていることが分かる。

Visual Studio Codeの[ターミナル]タブの最下行に注目するとQRコードのバージョンが4になっていることが分かる
Visual Studio Codeの[ターミナル]タブの最下行に注目するとQRコードのバージョンが4になっていることが分かる

 また、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コードの読み取り

 最後に作成した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


「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る