簡単便利! QRコードの画像生成
はじめに
今回は、1994年にデンソーが開発したQRコードをPythonで画像生成します。
【参照】QRコードについて
【関連】
QRcodeの読み取り
目次
作業環境
Androidスマホ
Pydroid3(python3.7)
ライブラリPillow
画像を作成・保存するためにライブラリでPillow
を使っています。※ Qpythonはpillowがインストール出来ない為、Pythonコードの実行には使えません。
必要なモジュール
QRコードの画像生成用モジュールqrcodeを使います。
画像イメージの作成に画像処理用モジュールPillowも使うようなので一緒にインストールします。
2つ同時にインストール。
pip install qrcode pillow
QRコードの画像生成
QRコードは文字情報を画像化したものです。画像化する商品番号やWebページのURLなどの文字情報を与えて実行し画像にします。
PYPI.orgのqrcodeページURLをQRコードにしてみます。
import qrcode img = qrcode.make("https://pypi.org/project/qrcode/") # カレントディレクトリに保存 img.save("QRCode_test.png")
簡単にQRコードが生成されました。
細かい設定
QRCodeクラスを使えば、より細かい設定ができます。
PYPI.org qrcodeのAdvanced Usageからコードを抜粋し、上から見ていきます。
import qrcode qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) qr.add_data('Some data') qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white")
versionパラメーター
上記にversion=1
と書いてあります。
- QRコードのサイズによって1~40までの整数の値をとります。
- 一番小さな
version=1
は21×21の行列。 - 画像化する文字情報が大きければversionも大きいものにし、QRコードの画像サイズも大きくなります。
- 文字情報が多く、指定したversionが小さくて足りなかった場合は自動的にversionが必要最小のものに変わります。
- versionを指定しなければ自動的に決めてくれます。
error_correctionパラメーター
文字を画像化する際の誤りを修正する度合いの設定。
以下の4段階があり、修正度合いを高くすれば画像サイズも大きくなる。
qrcode.constsnts
で指定。
- ERROR_CORRECT_L - 7%までの訂正能力
- ERROR_CORRECT_M (デフォルト) - 15%までの訂正能力
- ERROR_CORRECT_Q - 25%までの訂正能力
- ERROR_CORRECT_H
- 30%までの訂正能力
box_sizeパラメーター
白黒で表された四角の各マスbox
のピクセルサイズが設定できる。
version
が同じでも、この設定を変えることで画像のサイズを変えられる。
デフォルトはbox_size=10
borderパラメーター
白黒の外周につける余白のサイズを設定。
box_size
の何個分の余白にするかを指定する。
デフォルトは最小の4。
fill_colorとback_color
make_image()
メソッドの引数。マス目塗りつぶしの色と、背景色の設定。
デフォルトはfill_color="black"
とback_color="white"
。
RGBカラーコードの#00ffff
や定義された色名red
などで指定。
【応用】 リストからQRコードを一気に生成する
スプレッドシートに記載された商品名のリストを取得し、それを全てQRコード画像にします。
次の手順で行う。
必要なものとして、Excelシートの読み書き用にpandas、OpenPyxl、xlrd、xlwtのインストール。
あとは、商品一覧表のスプレッドシートを準備。
1. 画像保存用フォルダ作成
import os # QRコードの画像保存フォルダ(カレントディレクトリ下に作成) dir_path = "./Qrcode_Images" # 同一フォルダがなければ作成(条件つけないと実行時エラーに) if os.path.exists(dir_path) == False: os.mkdir(dir_path)
2.スプレッドシート商品一覧表の読み取り
商品一覧表はカレントディレクトリに保存してある。
import pandas as pd # スプレッドシートのファイル名 file_name = "商品一覧表.xlsx" # 商品一覧表の先頭シートをpandasで読む df = pd.read_excel(file_name,sheet_name=0) # 先頭シートの出力 print("【先頭シートを出力】\n") print(df) print("==================") # 商品名のある2列目を取り出す df_shouhin_names = df["商品名"] # 商品名の列を出力 print("【商品名の列を出力】\n") print(df_shouhin_names)
【先頭シートを出力】
商品番号 商品名
0 1 頭のネジ
1 2 世の歯車
2 3 永久機関エンジン
3 4 再発明の車輪
4 5 効かないブレーキ
==================
【商品名の列を出力】
0 頭のネジ
1 世の歯車
2 永久機関エンジン
3 再発明の車輪
4 効かないブレーキ
Name: 商品名, dtype: object
3.商品名をQRコード画像ファイルに変換
今回はデフォルトの設定で行う。
画像処理モジュール pillowがインストールされてなければ、この実行時にエラーが出る。
importする必要はないようだ。
import qrcode # 手順2で取得の商品名データを順番にQRコード生成 for name in df_shouhin_names: img = qrcode.make(name) # 手順1で作成したフォルダに保存 file_path_name = os.path.join(dir_path, name + ".png") img.save(file_path_name)
4.スプレッドシート最終列に画像のパスを追加し新規ファイルに書き込む
生成されたQRコード画像のパスを取得して、新規ファイルに書き込みをする。
import glob # QRコード画像をリストで取得 dir_path = "QRCode_Images" qrcode_lst = glob.glob(dir_path + "/*png") # 画像リストを絶対パスに変換 for i, rel_path in enumerate(qrcode_lst): absp = os.path.abspath(rel_path) qrcode_lst[i] = absp # 画像パスを追加した後のDataFrame作成 df_add_column = pd.DataFrame(qrcode_lst) df["QRコード画像"] = df_add_column # 新規ファイルに書き込む new_sheetfile_name = dir_path + "/" + "QRコード画像生成記録.xlsx" df.to_excel(new_sheetfile_name)
QRコード画像のパスを追加したスプレッドシートがQrcode_Images
フォルダに新規作成されました。
おわりに
QRコードは製造現場や物流での部品や商品管理、作業の進捗状況の管理、医療現場での投薬の管理、支払いの決済など様々な場所や状況で使われているということで、アイデア次第で色々捗りますね。
ありがとうございました。