QRコードの生成と保存

このページではPythonのライブラリqrcodeを使用してQRコードを生成する方法について解説します。

qrcode

そのままずばりqrcodeというライブラリを使用するとqrコードの生成が可能です。GitHubのドキュメントがわかりやすいため一読することをおすすめします。

qrcode PyPI
https://github.com/lincolnloop/python-qrcode

以下のコマンドでインストールすることが可能です。Pillowが同梱されます。

pip install qrcode[pil]

QRコードの生成と保存

基本的な使い方

qrcodeモジュールをインポートし、qrcode.QRCodeオブジェクトを生成、add_dataでデータ設定、make_imageでQRコードを生成することができます。make_imageの戻り値はPillowのImageオブジェクトがなので、showで確認のために表示したりsaveで保存することが可能です。

Pillowの使い方

2018年8月12日

以下のコードではPython公式サイトのURLをQRコードに変換し表示した後保存しています。なお、make_imageの引数でボックスの色と背景色を指定しています。

import qrcode

qr = qrcode.QRCode()
qr.add_data('https://www.python.org/')
img = qr.make_image(fill_color="black", back_color="white")
img.show()
img.save("sample1.png")

QRコードの設定

細かいカスタマイズをしたい場合はqrcode.QRCodeオブジェクトを生成する際にオプションでサイズやバージョン、誤り訂正レベル等を指定します。

  • box_size:パラメータはQRコードの各ボックスのピクセル数を設定することができます。
  • border:パラメーターは境界線の太さのボックスの数を設定することができます。(デフォルトは最小値の4となります)。
  • version:でQRコードのバージョンを指定することができます。

データ量とならびQRコードの大きなメリットとして誤り訂正ができる、という点が挙げられます。qrcodeは以下の誤り訂正レベルが指定できますが、50%のレベルSはサポートされていません。なお、デフォルトはERROR_CORRECT_M となります。

  • RROR_CORRECT_L:約7%以下の誤りを訂正
  • ERROR_CORRECT_M:約15%以下の誤りを訂正
  • ERROR_CORRECT_Q:約15%以下の誤りを訂正
  • ERROR_CORRECT_H:約15%以下の誤りを訂正

以下のコードでは、バージョン7、誤り訂正30%、ボックスサイズ5、ボーダー7でQRコードを生成しています。

import qrcode

qr = qrcode.QRCode(
    version=7,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=5,
    border=7,
)
qr.add_data('https://www.python.org/')
img = qr.make_image(fill_color="black", back_color="white")
img.show()
img.save("sample-qr.png")

スタイルの設定

qrcodeモジュールにはQRコードのボックスのスタイルを指定するものが用意されています。キャンペーン等で使用する場合はイメージに合わせたスタイルを選ぶことができますね。ただし、こういったスタイルを適用したQRコードはスキャナによっては動作がサポートされていないという点に注意してください。qrcode.image.styles.moduledrawers配下のスタイルを指定します。

以下のコードでは、様々なスタイルのQRコードを生成しています。

import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import GappedSquareModuleDrawer, CircleModuleDrawer, RoundedModuleDrawer, \
    VerticalBarsDrawer, HorizontalBarsDrawer

qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_L)
qr.add_data('https://www.python.org/')

img_1 = qr.make_image(image_factory=StyledPilImage, module_drawer=GappedSquareModuleDrawer())
img_2 = qr.make_image(image_factory=StyledPilImage, module_drawer=CircleModuleDrawer())
img_3 = qr.make_image(image_factory=StyledPilImage, module_drawer=RoundedModuleDrawer())
img_4 = qr.make_image(image_factory=StyledPilImage, module_drawer=VerticalBarsDrawer())
img_5 = qr.make_image(image_factory=StyledPilImage, module_drawer=HorizontalBarsDrawer())

img_1.save("GappedSquareModuleDrawer.png")
img_2.save("CircleModuleDrawer.png")
img_3.save("RoundedModuleDrawer.png")
img_4.save("VerticalBarsDrawer.png")
img_5.save("HorizontalBarsDrawer.png")

画像の埋め込み

画像を埋め込むことも可能です。Pillowで座標計算をしてもいいのですが、embeded_image_pathを指定すると画像を真ん中に埋め込むことが可能です。これは誤り訂正機能を活用しているわけですが、確実に動作するとは限らないため公式の見解では非推奨となっています。参考:FAQ|QRコードドットコム

import qrcode
from qrcode.image.styledpil import StyledPilImage

qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_L)
qr.add_data('https://www.python.org/')
img = qr.make_image(image_factory=StyledPilImage, embeded_image_path="python-powered-h-50x65.png")
img.save("embed.png")