kuroの覚え書き

96の個人的覚え書き

文字列とQRコードを並べて合体した画像を作成する。

テプラには文字列から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でいいんだけど。