テプラには文字列からQRコードを生成して、テープに印字する機能があるのだが、このQRコード生成と文字情報の印字の入力は別系統な操作が必要で結構面倒臭い。
なので、QRコードと文字情報をまとめて画像にしてしまって画像挿入機能一操作だけで完結できるようにすると良いのではないかな。
ということでQR生成と合わせて文字も画像化してこれらを合体してやりたい。
QR生成と文字の画像化まではできているのであとは合体だな。
これにはpillowモジュールが使えるようだ。
要するに新規画像を作成して、その画像の適当な座標にパーツとなる画像をprintするという手順のようだ。
つなげ合わせる画像のサイズにぴったりの余白のない合成画像を作りたければ、それぞれの画像のサイズを調べてそれらを足し算した新規画像を用意すると良いというわけ。
from PIL import ImageFont from PIL import Image from PIL import ImageDraw fontFile = 'ipaexg.ttf' font = ImageFont.truetype(fontFile, 64, encoding='utf-8') p_id2 = 'ID: ' + p_id w, h = font.getsize(p_id2) print('%s w:%d h:%d' % (p_id2, w, h)) im = Image.new('RGB', (w, h), (255,255,255)) draw = ImageDraw.Draw(im) draw.text((0, 0), p_id2, fill=(0,0,0), font=font) data = dir + '/id_' + p_id + '_id.png' im.save(data) plant_id = 'Plant: ' + plant_id w, h = font.getsize(plant_id) print('%s w:%d h:%d' % (plant_id, w, h)) im = Image.new('RGB', (w, h), (255,255,255)) draw = ImageDraw.Draw(im) draw.text((0, 0), plant_id, fill=(0,0,0), font=font) data = dir + '/id_' + p_id + '_pid.png' im.save(data) p_date ='Date: ' + p_date w, h = font.getsize(p_date) print('%s w:%d h:%d' % (p_date, w, h)) im = Image.new('RGB', (w, h), (255,255,255)) draw = ImageDraw.Draw(im) draw.text((0, 0), p_date, fill=(0,0,0), font=font) data = dir + '/id_' + p_id + '_pdt.png' im.save(data) owner = 'Owner: ' + owner w, h = font.getsize(owner) print('%s w:%d h:%d' % (owner, w, h)) im = Image.new('RGB', (w, h), (255,255,255)) draw = ImageDraw.Draw(im) draw.text((0, 0), owner, fill=(0,0,0), font=font) data = dir + '/id_' + p_id + '_own.png' im.save(data)
ここまでで4つの文字データを画像データに変換している。
im0 = Image.open(dir + '/id_' + p_id + '_id.png') im1 = Image.open(dir + '/id_' + p_id + '_pid.png') im2 = Image.open(dir + '/id_' + p_id + '_pdt.png') im3 = Image.open(dir + '/id_' + p_id + '_own.png') w0, h0 = im0.size w1, h1 = im1.size w2, h2 = im2.size w3, h3 = im3.size
ここで書く画像のサイズを調べている
w = max(w0, w1, w2, w3)
こうやって一番大きい画像に合わせて画像を作成すれば無駄が出ないはずなんだけど、なぜかエラーが出てうまくいかない・・・
maxに必要なモジュールってなんかいるのかな?
仕方がないので、とりあえず横幅は十分なサイズで一律固定として処理する。
w = 800 h = h0+h1+h2+h3 im = Image.new('RGB', (w, h), (255,255,255)) im.paste(im0, (0, 0)) im.paste(im1, (0, h0)) im.paste(im2, (0, h0 + h1)) im.paste(im3, (0, h0 + h1 + h2)) data = dir + '/id_' + p_id + '_merge.png' im.save(data) im1 = Image.open(dir + '/id_' + p_id + '.png') im2 = Image.open(dir + '/id_' + p_id + '_merge.png') w1, h1 = im1.size w2, h2 = im2.size im = Image.new('RGB', (w1 + w2, h1), (255,255,255)) im.paste(im1, (0, 0)) im.paste(im2, (w1, 30)) data = dir + '/id_tag.png' im.save(data)
こんな感じに座標を指定して貼り付けてやればいいのだね。
ちなみに12mm幅のテープに印刷したらQRのドットが抜けてしまうのか読み取れず18mmのテープが必要であった。
テプラのソフトで生成した QRコードだと読めたんだけどな。まあ4段に組んだ文字列は12mmじゃ虫眼鏡で見ないと読めないから18mmでいいんだけど。