👩‍💻

#123 PythonでQRコードを生成してみる

に公開

はじめに

今回はPythonを使ってQRコードを生成してみました。
簡単に生成でき、デザインを変更することもできたのでいろいろと試してみました。

準備

以下のコマンドを実行してqrcodeとPillowをインストールします。

pip install qrcode[pil]

qrcodeはQRコードを生成するためのライブラリです。
Pillow (PIL)は画像操作のためのライブラリで、QRコードを画像として保存するために使用されます。

QRコードを生成してみる

まずはよく見る白黒のQRコードを生成してみます。

import qrcode

# QRコードに埋め込むデータ
data = "https://example.com"

# QRコードを作成する
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4,
)

# データを追加
qr.add_data(data)
# サイズを自動調整
qr.make(fit=True)

# QRコード画像を生成
img = qr.make_image(fill_color="black", back_color="white")

# 画像を保存
img.save("qrcode.png")

print("QRコードを保存しました:qrcode.png")

qrcode.png

実行すると、指定したデータ(この場合は https://example.com )を含むQRコードが生成され、qrcode.pngというファイル名で保存されます。

カスタム

色を変えてみる

make_imageメソッドで指定すると、fill_color(QRコードのドット色)やback_color(背景色)が変更できます。

import qrcode

# QRコードに埋め込むデータ
data = "https://example.com"

# QRコードを作成する
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=4,
)

qr.add_data(data)
qr.make(fit=True)

# カスタム色のQRコードを作成
img = qr.make_image(fill_color="green", back_color="yellow")

# 画像を保存
img.save("colored_qrcode.png")

print("QRコードを保存しました:colored_qrcode.png")

colored_qrcode.png

QRコードのドット色を緑、背景色を黄色に変更してみました。

ロゴを埋め込んでみる

QRコードに画像を埋め込むこともできるようです。
QRコードの中央に画像を配置してみます。

from PIL import Image
import qrcode

# QRコードに埋め込むデータ
data = "https://example.com"

# QRコードを作成する
qr = qrcode.QRCode(
    version=2,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=4,
)

qr.add_data(data)
qr.make(fit=True)

# QRコード画像を生成
img = qr.make_image(fill_color="blue", back_color="white").convert("RGBA")

# 画像を追加
photo = Image.open("photo.png") 
photo_size = (80, 80)
photo = photo.resize(photo_size)

# 画像をQRコードの中央に配置
pos = ((img.size[0] - photo.size[0]) // 2, (img.size[1] - photo.size[1]) // 2)
img.paste(photo, pos, photo)

# 画像を保存
img.save("photo_qrcode.png")

print("QRコードを保存しました:photo_qrcode.png")

logo_qrcode.png

QRコードの中央に画像を配置できました。
配置する画像の大きさが大きいと、QRコードが読み取れなくなることがあるので注意が必要です!

背景画像を変えてみる

QRコードの背景色を透明にし、指定した画像を背景として合成してみます。

from PIL import Image
import qrcode

# 埋め込むデータ
data = "https://example.com"

# QRコードの設定
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=4,
)

qr.add_data(data)
qr.make(fit=True)

# QRコード画像を生成
qr_img = qr.make_image(fill_color="black", back_color="white").convert("RGBA")

# QRコード画像の背景を透明にする
pixels = qr_img.load()
for y in range(qr_img.size[1]):
    for x in range(qr_img.size[0]):
        if pixels[x, y] == (255, 255, 255, 255):  # 白のピクセルを透明に
            pixels[x, y] = (255, 255, 255, 0)

# 背景画像を読み込み
background = Image.open("background.jpg").convert("RGBA")
background = background.resize(qr_img.size)

# 背景画像とQRコードを合成
combined = Image.alpha_composite(background, qr_img)

combined.save("background_qrcode.png")

print("QRコードを保存しました:background_qrcode.png")

background_qrcode.png

涼しいデザインになりました!

QRコードのドットの形を変えてみる

QRコードのドットの形を変更して、四角や丸型のドットを使用したQRコードを生成してみます。

ドットを四角型にする

import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import GappedSquareModuleDrawer
from qrcode.image.styles.colormasks import RadialGradiantColorMask

# QRコード設定
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)

# 四角型のドットQRコード
img = qr.make_image(
    image_factory=StyledPilImage,
    module_drawer=GappedSquareModuleDrawer(),  # 四角のスタイル
    color_mask=RadialGradiantColorMask()       # 放射状グラデーション
)

# 保存
img.save("square_qrcode.png")

print("QRコードを保存しました:square_qrcode.png")

square_qrcode

ドットを丸型にする

import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import RoundedModuleDrawer
from qrcode.image.styles.colormasks import RadialGradiantColorMask

# QRコード設定
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)

# 丸型ドットのQRコード
img = qr.make_image(
    image_factory=StyledPilImage,
    module_drawer=RoundedModuleDrawer(),  # 丸いドット
    color_mask=RadialGradiantColorMask()  # 放射状グラデーション
)

# 保存
img.save("rounded_qrcode.png")

print("QRコードを保存しました:rounded_qrcode.png")

rounded_qrcode.png

最後に

QRコードの生成とデザインの変更を試してみました。
他にもデザインや見せ方を変えられるようなので、ぜひ試してみてください。
ご覧いただきありがとうございました。

Discussion