よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

簡単便利! QRコードの画像生成

はじめに


今回は、1994年にデンソーが開発したQRコードPythonで画像生成します。

【参照】QRコードについて

デンソーウェーブ
QRコード Wikipedia



【関連】
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コードが生成されました。

f:id:chayarokurokuro:20190912023746j:plain



細かい設定


QRCodeクラスを使えば、より細かい設定ができます。
PYPI.org qrcodeAdvanced 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で指定。

  1. ERROR_CORRECT_L    - 7%までの訂正能力
  2. ERROR_CORRECT_M (デフォルト)    - 15%までの訂正能力
  3. ERROR_CORRECT_Q    - 25%までの訂正能力
  4. 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コード画像にします。

次の手順で行う。

  1. QRコード画像の保存フォルダを作成
  2. スプレッドシートの商品一覧表を読み取る
  3. 商品名リストをQRコードに変換し画像を保存する
  4. スプレッドシートの最終列に画像のパスを書き込んだ物を別のファイルに新規作成



必要なものとして、Excelシートの読み書き用にpandasOpenPyxlxlrdxlwtのインストール。
あとは、商品一覧表のスプレッドシートを準備。

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コードは製造現場や物流での部品や商品管理、作業の進捗状況の管理、医療現場での投薬の管理、支払いの決済など様々な場所や状況で使われているということで、アイデア次第で色々捗りますね。


ありがとうございました。