Pythonで簡単にできる!QRコードに画像を埋め込む方法

Python

PythonでQRコードを生成するには?

帳票作成のプログラムを書いている時などでQRコードを生成して利用したい機会があると思います。Pythonではqrcodeモジュールを利用することにより簡単にQRコードを生成することが可能となっています。


QRコードはバーコードと比較して以下のような特性があります。

  1. 大容量: QRコードはバーコードよりも多くの情報を格納できます。バーコードは数十文字程度の情報しか保持できませんがQRコードは数千文字のデータを格納でき、よく使われる用途としてはURLを埋め込みしてPRしたりQRコード決済などで利用できます。
  2. 小型化: 同じ量のデータを格納する場合QRコードはバーコードよりも小さなスペースに収めることができます。これにより商品の小型化や限られたスペースに多くの情報を記載することが可能になります。
  3. 高速読取: QRコードは高速で読み取ることができ、方向を問わずスキャン可能です。これはQRコードがバーコードに比べて読み取り精度が高くエラー訂正機能を持っているためです。
  4. 耐久性と堅牢性: QRコードは部分的に損傷しても読み取りが可能です。エラー訂正機能により汚れや傷があっても正確な情報の読み取りが期待できます。これに対してバーコードは損傷すると読み取りが難しくなることがあります。

本記事では、Pythonで通常のQRコードを作成する関数画像埋め込みQRコードを作成する関数を紹介します。

※QRコードはデンソーウェーブの登録商標です。

PythonでQRコードを生成するサンプルコード

create_qrcode関数のサンプルコードを紹介します。

# pip install qrcode
import qrcode  # qrcodeモジュールをインポート

def create_qrcode(data, filename='qr_code.png'):
    """
    指定されたデータを含むQRコードを画像生成しファイルとして保存する関数。

    この関数は `qrcode` ライブラリを使用して、指定されたデータ(テキストやURLなど)からQRコードを生成します。
    生成されたQRコードは、指定されたファイル名で保存されます。

    Args:
        data (str): QRコードにエンコードするデータ。
        filename (str, optional): 生成されたQRコードの画像ファイル名。デフォルトは 'qr_code.png'。

    Returns:
        PIL.Image.Image: 生成されたQRコードのイメージオブジェクト。

    """

    # QRコード生成を初期化
    qr = qrcode.QRCode(
        version=1,  # QRコードのバージョン。1から40までの整数で、数が大きいほどデータ容量が大きくなる。
        error_correction=qrcode.constants.ERROR_CORRECT_L,  # エラー訂正レベル。L(低)、M(中)、Q(高)、H(最高) まで選択可能。
        box_size=5,  # QRコードの各ボックスのピクセルサイズ。
        border=2,  # QRコードの周囲のボーダーのサイズ。
    )

    # データをQRコード生成に追加
    qr.add_data(data)
    # QRコードを生成。fit=Trueにより、最適なサイズで生成される。
    qr.make(fit=True)  

    # QRコードを画像として生成
    qr_img = qr.make_image(fill_color="black", back_color="white")  # QRコードの色設定。黒と白で生成。
    #qr_img = qr.make_image(fill_color="red", back_color="white")  # QRコードの色設定。赤と白で生成。

    # 画像ファイルとして保存 ※ファイル名付で保存する必要がない場合にはコメントアウト。
    qr_img.save(filename) 

    # 生成したイメージオブジェクトを返す。
    return qr_img  



##############################################################
# 関数のテスト
if __name__ == "__main__":

    # テストデータ
    test_data = "https://kamedassou.com"
    # QRコードを生成
    qrcode_image = create_qrcode(test_data)
    # 生成したQRコードを表示
    qrcode_image.show()

    # 長いテキストを用いたQRコードの生成
    test_data = "吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。"
    # 別のファイル名でQRコードを生成
    qrcode_image = create_qrcode(test_data,"qr_code_Iamthecat.png")
    # 生成したQRコードを表示
    qrcode_image.show()

サンプルを実行する前にqrcodeのインストールが必要ですのでインストールしていない場合には対応してください。

pip install qrcode

以下処理は関数内でpngファイルとして保存する必要がない場合にはコメントアウトしてください。

    # 画像ファイルとして保存 ※ファイル名付で保存する必要がない場合にはコメントアウト。
    qr_img.save(filename) 

実行結果

実行すると2つのQRコードが作成されて画面に表示されます。

1つめは本サイトのURL
「https://kamedassou.com」

2つめは夏目漱石の吾輩は猫であるの冒頭文です。

「吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。」

情報量が多いと画像が複雑になるのが見てとれます。

Pythonで画像埋め込みQRコードを生成するサンプルコード

次にQRコード内に画像が埋め込まれたQRコードを出力するcreate_frame_qrcode関数のサンプルコードを紹介します。

事前準備として、以下のファイルをダウンロードして解凍してください。



ダウンロード後は以下の図のようにCドライブにtestfileというフォルダを作成し、その中に上記2ファイルをコピーしてください。

# pip install qrcode
import qrcode
# pip install Pillow
from PIL import Image

def create_frame_qrcode(data, logo_path, logo_size=(100, 100), filename='frame_qrcode.png'):
    """
    画像埋め込みQRコードを生成する関数。

    Args:
        data (str): QRコードにエンコードするデータ。
        logo_path (str): 中央に挿入する画像ファイルのパス。
        logo_size (tuple, optional): 中央に挿入する画像のサイズ。デフォルトは (100, 100)
        filename (str, optional): 生成されたQRコードの画像ファイル名。デフォルトは 'frame_qrcode.png'

    Returns:
        PIL.Image.Image: 生成されたQRコードのイメージオブジェクト。
    """
    # QRコード生成オブジェクトの初期化
    # version=1: QRコードのバージョンを1に設定
    # error_correction: エラー訂正レベルを高(H)に設定
    # box_size: QRコード内の各ボックスのサイズを設定
    # border: QRコードの周囲のボーダーの大きさを設定
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=10,
        border=4,
    )
    # QRコードにデータを追加
    qr.add_data(data)
    qr.make(fit=True)

    # QRコードイメージを作成し、カラーモードを 'RGB' に変換
    qr_img = qr.make_image(fill_color='black', back_color='white').convert('RGB')

    # ロゴ画像を読み込み、指定されたサイズにリサイズ
    logo = Image.open(logo_path)
    logo = logo.resize(logo_size)

    # ロゴ画像が 'RGBA' モード(透明度を含む)の場合、透明度情報をマスクとして取り出す
    if logo.mode == 'RGBA':
        mask = logo.split()[3]  # アルファチャネルをマスクとして使用
    else:
        mask = None  # 透明度情報がない場合はマスクは不要

    # QRコード画像の中央にロゴを挿入
    qr_width, qr_height = qr_img.size
    logo_width, logo_height = logo.size
    pos = ((qr_width - logo_width) // 2, (qr_height - logo_height) // 2) # 中心のポジションを計算
    qr_img.paste(logo, pos, mask=mask)  # ロゴを挿入

    # QRコード画像をファイルとして保存 ※ファイルとして保存が不要であればコメントアウト
    qr_img.save(filename)

    return qr_img




##############################################################
# 関数のテスト
if __name__ == "__main__":

    # QRコードにエンコードするデータとロゴ画像のパスを指定
    test_data = "https://kamedassou.com"
    logo_path = "c:\\testfile\\logo.png"
    # QRコード画像を生成し、表示する
    qrcode_image = create_frame_qrcode(test_data, logo_path,[100,100], "c:\\testfile\\frame_qrcode.png")
    qrcode_image.show()


    # QRコードにエンコードするデータとロゴ画像のパスを指定 透過png
    test_data = "https://kamedassou.com"
    logo_path = "c:\\testfile\\logo_rgba.png"
    # QRコード画像を生成し、表示する 画像サイズ[200,200]とファイル名を追加指定。
    qrcode_image = create_frame_qrcode(test_data, logo_path, [200,200], "c:\\testfile\\frame_qrcode_rgba.png")
    qrcode_image.show()



サンプルを実行する前にqrcodeモジュール、Pillowモジュールのインストールが必要ですのでインストールしていない場合には対応してください。※pip install qrcodeは実行していれば不要です。

pip install qrcode
pip install Pillow

実行結果

実行すると2つのQRコードが作成されて画面に表示されます。

1つめは本サイトのURL
「https://kamedassou.com」と本サイトのロゴが入った形式です。

2つめは本サイトのURL
「https://kamedassou.com」とキャンディの透過PNGが入った形式です。
どちらも同じQRコードが表示されているのがみてとれますが、第三引数のlogo_sizeを目立たせるために画像サイズを大きくするとエラー訂正用のデータも隠されてQRコードが読み込みできなくなりますので注意してください。

最後に

Pythonではqrcodeモジュールを利用することにより比較的簡単にQRコードを生成することが可能となっています。

QRコードを生成して業務利用に生かしてみてはいかがでしょうか。

また、バーコードを出力する記事もありますので興味のある方は参照してみてはいかがでしょうか。

コメント

タイトルとURLをコピーしました