この記事だけでOK!PythonでQRコードを扱う完全ガイド【保存版】

QRコードは情報を手軽に伝えるツールとして、Webやモバイルアプリ、マーケティングまで幅広く活用されています。

この記事では、Pythonを使ったQRコード生成と解析方法を完全網羅し、初心者でも使えるように徹底解説し、WEBアプリの制作方法までガイドします。

QR作成ツールや、Canvaなどでもツールが用意されていますが、もちろんローカル環境でもっと多彩なアレンジや生成が可能になりますので、是非最後まで読んでいってくださいね。

必要なライブラリの紹介とインストール方法

PythonでQRコードを扱うために、以下のライブラリが必要です。

  • qrcode:QRコードの生成を簡単に行えるライブラリ
  • Pillow:生成したQRコードに加工やカスタマイズを加えるためのライブラリ
  • OpenCV:QRコードを画像ファイルから読み取り、解析するのに最適なライブラリ

以下のコマンドでインストール可能です。

pip install qrcode[pil] opencv-python

PythonでのQRコード生成

基本的なQRコードの生成

qrcodeライブラリを使えば、QRコード生成はとても簡単です。

次のコードではURLをQRコードに変換して生成します。

import qrcode

# QRコード生成
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4,
)
qr.add_data("https://example.com")
qr.make(fit=True)

# 画像として生成
img = qr.make_image(fill_color="black", back_color="white")
img.show()

version: QRコードの大きさやデータ量を決定。

1から40までの値があり、値が大きいほど容量が多い。

error_correction: 読み取りエラーの補正レベル。

4段階で設定可能。box_size: QRコードの1ボックスのサイズ(ピクセル単位)。

border: QRコード周りの余白のサイズ。

カスタマイズ方法

以下は、カスタムQRコードの作成方法です。

カラーやエラーレベル、ロゴの埋め込みなどが可能です。

import qrcode
from PIL import Image

qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=4,
)
qr.add_data("https://example.com")
qr.make(fit=True)

# カラー設定
img = qr.make_image(fill_color="blue", back_color="yellow")
img = img.convert("RGBA")

# ロゴの埋め込み
logo = Image.open("path/to/logo.png")
logo = logo.resize((50, 50))
pos = ((img.size[0] - logo.size[0]) // 2, (img.size[1] - logo.size[1]) // 2)
img.paste(logo, pos, logo)
img.show()

QRコードを画像ファイルとして保存

img.save()メソッドを使えば、生成したQRコードをPNGやJPEG形式で保存できます。

img.save("qrcode.png", format="PNG")

QRコードの読み取りと解析

QRコードの読み取りには、OpenCVライブラリを使用します。

import cv2

# QRコード画像の読み込み
img = cv2.imread("qrcode.png")
detector = cv2.QRCodeDetector()
data, vertices, rectified_qr_code = detector.detectAndDecode(img)

if data:
    print("QRコード内容:", data)

動的QRコード

QRコードには、**「動的QRコード」と呼ばれる、後から中身のURLや内容を変更できるタイプがあります。

この動的QRコードと従来の「静的QRコード」**にはいくつか違いがあり、特にビジネス用途での利便性が注目されています。

動的QRコードでは、QRコード自体が固定のURLや情報ではなく、中間サーバーを経由してリダイレクト先を決める仕組みが導入されています。

QRコードに含まれるURLは、データベース上の短縮URLやリダイレクトURLになっており、後からリダイレクト先のURLを自由に変更できるため、QRコード自体を再発行する必要がありません。

  1. QRコードに短縮URLまたはリダイレクトURLが含まれる。
  2. QRコードをスキャンすると中間サーバー(短縮URLサービスなど)を経由する。
  3. 中間サーバーで設定されたリダイレクト先にユーザーが転送される。
  4. 必要に応じて管理画面などでURLを変更すれば、QRコードはそのままでリンク先のみが変わる。

動的QRコードのメリット

  1. 情報の更新が可能:
    • URLやコンテンツが変わった場合でも、QRコードを再印刷せずに内容を更新できます。
  2. アクセス解析が可能:
    • 中間サーバーでトラッキングすることで、スキャン数や利用時間帯などの分析が可能です。
  3. 柔軟な運用ができる:
    • キャンペーンURLや一時的なプロモーションページにリンクする場合、動的QRコードは非常に便利です。
種類 特徴 メリット デメリット
静的QRコード 一度生成すると情報の変更ができない固定型QRコード – 無料で利用可能なサービスが多い
– 情報が埋め込まれるため、中間サーバー不要でスキャン時に直接リンク
– URLや情報の変更にはQRコードの再発行が必要
– アクセス解析などのトラッキング機能は非対応
動的QRコード リダイレクトURLで情報管理し、リンク先を後から変更できるQRコード – リンクの変更やアクセス解析が可能
– 企業プロモーションなどで効果的な運用が可能
– 中間サーバーが必要でコストがかかることが多い
– リダイレクトの管理と運営に技術的な構築が必要

ただし動的QRコードのサービスリリースは、運用が求められ複雑な技術と運用コストがかかります。

リアルタイムQRコード生成Webアプリをつくる

ここから、せっかくなので、リアルタイムQRコード生成Webアプリの構築を学びましょう。

このプロジェクトでは、PythonのWebフレームワーク「Flask」と「qrcode」ライブラリを使用し、Webページ上でQRコードを生成・表示するシンプルなアプリを作成します。

必要なツール・ライブラリ

  • Flask:Pythonの軽量Webフレームワーク。Webアプリのフロントエンドとバックエンドを結ぶ役割を果たします。
  • qrcode:QRコード生成に特化したライブラリ。
  • Pillow:qrcodeの生成したQRコードを画像として処理・保存します。

以下のコマンドで必要なライブラリをインストールします。

pip install Flask qrcode[pil]

Flaskアプリの基本構成をおさらい

まずは、基本的なFlaskアプリの構成を作成します。

qr_code_app/
├── app.py            # Flaskアプリのメインファイル
├── static/           # 静的ファイル(QRコード画像など)
├── templates/        # HTMLテンプレート
│   └── index.html    # QRコード生成ページ
└── qr_codes/         # QRコード画像を保存するフォルダ

Flaskアプリのセットアップ

app.pyファイルを作成し、Flaskアプリの基本設定を行います。

from flask import Flask, render_template, request, send_file
import qrcode
import os

app = Flask(__name__)

# QRコード画像の保存先ディレクトリ
QR_CODE_FOLDER = "qr_codes"
os.makedirs(QR_CODE_FOLDER, exist_ok=True)

@app.route("/", methods=["GET", "POST"])
def index():
    qr_code_path = None
    if request.method == "POST":
        # フォームからQRコードに変換するテキストを取得
        text = request.form.get("text")

        # QRコード生成
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_H,
            box_size=10,
            border=4,
        )
        qr.add_data(text)
        qr.make(fit=True)

        # QRコードを画像として保存
        img = qr.make_image(fill_color="black", back_color="white")
        qr_code_path = os.path.join(QR_CODE_FOLDER, "qr_code.png")
        img.save(qr_code_path)

    return render_template("index.html", qr_code_path=qr_code_path)

# 画像表示用ルート
@app.route("/qr_code")
def qr_code():
    qr_code_path = os.path.join(QR_CODE_FOLDER, "qr_code.png")
    return send_file(qr_code_path, mimetype="image/png")

if __name__ == "__main__":
    app.run(debug=True)

HTMLテンプレートの作成

QRコードを生成するページのHTMLテンプレートindex.htmlを作成します。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>リアルタイムQRコード生成</title>
</head>
<body>
    <h1>リアルタイムQRコード生成アプリ</h1>
    <form method="post">
        <label for="text">QRコードに変換するテキスト:</label>
        <input type="text" id="text" name="text" required>
        <button type="submit">QRコード生成</button>
    </form>

    {% if qr_code_path %}
        <h2>生成されたQRコード:</h2>
        <img src="{{ url_for('qr_code') }}" alt="QR Code">
    {% endif %}
</body>
</html>

アプリの実行とテストとAzureへのデプロイ方法

applicationを実行してみてください。

ローカルサーバーが起動し、http://127.0.0.1:5000にアクセスするとアプリが表示されます。

テキスト入力フォームに変換したいテキストを入力し、「QRコード生成」をクリックすると、指定したテキストのQRコードがリアルタイムで生成され、ページに表示されます。

もちろんAzureなどにデプロイして使用することも可能。

こちらの記事でも詳細を解説しています。

Azureへのデプロイは必要なファイルを用意するところから始まります。

以下のファイルをFlaskアプリのフォルダに追加してください。

それぞれのファイルには必要なコードを記載するようにしてください。

  • requirements.txt:必要なPythonライブラリを記載
Flask
qrcode[pil]
gunicorn
  • startup command:Azure上でFlaskアプリを起動するコマンドを指定
web: gunicorn -w 4 -b 0.0.0.0:8000 app:app
  • Procfile(オプション):プロセスを指定するファイル

Azure App ServiceでWebアプリを作成

  1. Azureポータルにログインし、「リソースの作成」→「Web App」を選択します。
  2. 必要な情報を入力します。
    • App Serviceプラン: サーバーの規模を選択
    • ランタイムスタック: Python 3.xを選択
    • オペレーティングシステム: Linuxを推奨
  3. 設定が完了したら、**「確認および作成」**ボタンを押し、Webアプリを作成します。

4. FlaskアプリをAzureにデプロイ

Azure CLIまたはGitを使ってアプリをデプロイする方法があります。

ここでは、Gitを利用した方法を説明します。

  1. デプロイの準備: デプロイしたいアプリのフォルダでGitリポジトリを初期化します。
git init
git add .
git commit -m "Initial commit"

Azureリモートリポジトリを追加: Azureポータルの「デプロイセンター」で、デプロイ方法として「ローカルGit」を選択します。

表示された「GitリモートURL」をコピーします。

git remote add azure <AzureのGit URL>

Azureへプッシュ: リモートリポジトリにコードをプッシュします。

git push azure master

デプロイの確認とテスト

デプロイが完了すると、Azureポータルの「概要」ページにWebアプリのURLが表示されます。

このURLにアクセスし、アプリが動作していることを確認します。

QRコード生成Webアプリを別サーバーにホスティングし、iFrameで自身のサイト内に埋め込む方法もあります。

<iframe src="https://yourapp.azurewebsites.net" width="600" height="800" frameborder="0"></iframe>

QRコード生成アプリはリクエストがあった時点でQRコードを生成するため、**「常時実行が必要」**です。

常時実行するためには、Azure App Serviceのようなホスティングサービスでアプリを起動し続ける必要があります。

また、自前のサーバーで「gunicorn」や「uwsgi」などのアプリサーバーを使ってFlaskを常時起動させる構成もあります。

自前サーバーで常時実行する場合

自分のVPSやオンプレミスのサーバーでFlaskアプリを常時実行する場合、例えば月額500円~1000円のVPSをレンタルし、「gunicorn」などのアプリサーバーで常時稼働させる方法もあります。

  • おすすめVPSサービス:
    • ConoHa、さくらインターネット、GCPやAWSの無料枠など
サービス メリット デメリット 月額料金 おすすめ用途
ConoHa VPS – 初心者向けでセットアップが簡単
– SSD搭載で高速な処理
– 安価で手軽にサーバー運用が可能
– リソースが他社より少なめ
– トラフィックの増加に対応するには追加費用が発生
¥900~ (月額) 低トラフィックな個人Webアプリ、学習用途
さくらインターネット VPS – 長年の実績で安定稼働
– 価格帯が幅広く、初心者から上級者まで利用可能
– 日本国内のデータセンターで信頼性が高い
– 初心者にはやや複雑な設定
– 高トラフィック時にパフォーマンスの低下がある
¥600~ (月額) 国内向けWebアプリ、セキュリティ重視のサービス
GCP (Google Cloud Platform) 無料枠 – 1年間の無料枠と無料クレジット
– 高トラフィックに対応できる柔軟な拡張性
– 高性能で、AI/MLの統合が容易
– 無料枠が1年のため継続利用にはコスト発生
– 設定が高度で、学習が必要
無料 (1年間)、その後従量課金制 高負荷アプリ、学術研究、長期的なプロジェクト
AWS 無料枠 – 初年度無料枠あり
– 豊富なサービスと連携可能でスケーラビリティが高い
– グローバル展開が容易
– 設定が複雑で、初心者にはハードルが高い
– 無料枠超過時の課金に注意が必要
無料 (初年度)、その後従量課金制 大規模プロジェクト、企業向けアプリケーション