Pythonを使用して簡単にデジタルはんこを作成する方法[Pillowを使った画像生成 電子検印]

今回は、ちょっと会社でデジタルはんこが必要になり、Pythonで作れないかなと挑戦してみたので、その作成したものをシェアしようと思います。

使用ライブラリ

まずは、今回必要となるライブラリです。

  • Pillow

Pillowは、Pythonでは有名な画像処理ライブラリでとなります。
今回のライブラリはすでにインストール済みですので、すいませんが、画像はありません。
インストールには以下のコマンドを入力することでインストール可能です。

pip install Pillow

プログラムと実行結果

ではいつも通りプログラムの全体です。

from PIL import Image, ImageDraw, ImageFont
import os
import time

def main():
    base_W, base_H = (320,320)
    moji_Upper = "部署X"
    moji_Lower = "氏 名"
    yohaku = 10
    
    image = Image.new('RGBA', (base_W, base_H), 'white')
    image.putalpha(0)
    d = ImageDraw.Draw(image)
    
    d.ellipse([(yohaku, yohaku), (base_W - yohaku, base_H - yohaku)], outline='red', width=6)  # 円を描画
    
    #はんこ上部の文字を入れる
    adjust = 9
    hight = (( (base_H-yohaku*2) / 3 ) * 1) + yohaku
    d.line([(0+yohaku+adjust,hight),(base_W-yohaku-adjust,hight)],fill='red',width=6) # よこ線を入れる
    
    fontpath = "C:\Windows\Fonts\msgothic.ttc"
    font = ImageFont.truetype(fontpath, 60)
    moji_W, moji_H = d.textsize(moji_Upper, font=font)
    moji_W = (base_W/2) - (moji_W/2)
    moji_H = hight - moji_H - yohaku
    d.text(( moji_W,moji_H), moji_Upper, font=font, fill='red')
        
    hight = (( (base_H-yohaku*2) / 3 ) * 2) + yohaku
    d.line([(0+yohaku+adjust,hight),(base_W-yohaku-adjust,hight)],fill='red',width=6) # よこ線を入れる
    
    #日付を入れる
    now = time.localtime()
    date = time.strftime('%y/%m/%d', now) 
    
    fontpath = "C:\Windows\Fonts\msgothic.ttc"
    font = ImageFont.truetype(fontpath, 60)
    moji_W, moji_H = d.textsize(date, font=font)
    moji_W = (base_W/2) - (moji_W/2)
    moji_H = (base_H/2) - (moji_H/2)
    d.text(( moji_W,moji_H), date, font=font, fill='red')
    
    
    #はんこ下部の文字を入れる
    fontpath = "C:\Windows\Fonts\msgothic.ttc"
    font = ImageFont.truetype(fontpath, 60)
    moji_W, moji_H = d.textsize(moji_Lower, font=font)
    moji_W = (base_W/2) - (moji_W/2)
    moji_H = hight + yohaku
    d.text(( moji_W,moji_H), moji_Lower, font=font, fill='red')
    
    image.save(os.getcwd() + '\sample.png')
    

if __name__ == '__main__':
    main()

実行結果として以下のようなsample.pngという名前のpngファイルが生成されます。

続いてプログラムの解説ですが、解説は次ページにて記載します。

プログラム解説

このプログラムは実は簡単で、以下のような流れで構成されています。

  1. イメージインスタンスの生成
  2. 大外の円部分の描画
  3. 上側文字の部分の描画
  4. 上側の線を描画
  5. 真ん中 日時部分の描画
  6. 下側ラインの描画
  7. 下側文字の描画
  8. 画像の保存

細かい処理の前に概要を簡単に記載します。

  • イメージの生成サイズは、320×320で設定
  • 縦横それぞれを10ずつ余白を設定
  • 横のラインは、円を3等分に均等に割った部分に引かれるように設定
  • 文字は、真ん中にくるように調整


それでは、細かい詳細について説明します。

イメージインスタンスの生成

イメージインスタンスの生成は以下で行っています。
base_W, base_Hをイメージサイズ指定するための変数で設定し、以下のように処理を呼び出すだけです。

base_W, base_H = (320,320)
image = Image.new('RGBA', (base_W, base_H), 'white')
image.putalpha(0)
d = ImageDraw.Draw(image)

ここ重要

image.putalpha(0)というのは、はんこの枠と中身の文字だけが張り付けれるように、拝啓を透過するように設定してあります。

大外の円部分の描画

Pillowでは、円の描画にはellipseというAPIを使用して以下のように円を描きます。
ちなみに、第一引数は、円の座標を、第2引数のoutlineは色を、第3引数のwidthは線の太さを指定します。

今回の場合は、余白を設定したいので、それぞれ余白を開けるように座標を指定しています。

d.ellipse([(yohaku, yohaku), (base_W - yohaku, base_H - yohaku)], outline='red', width=6)

上側文字の部分の描画

続いて上側の文字の描画です。
Pillowでは、textというAPIを使用して文字を生成します。
ImageFont.truetypeというAPIで、フォントのフォーマットとサイズを生成し、これをtextに与えることでフォントや文字のサイズを指定できます。
ちなみに、textsizeというAPIを使えば、文字画像を生成する前に文字画像のサイズを取得することができます。
今回の場合は事前に文字のサイズを取得することで、画像の中心に文字が来るように調整してあります。

    fontpath = "C:\Windows\Fonts\msgothic.ttc"
    font = ImageFont.truetype(fontpath, 60)
    moji_W, moji_H = d.textsize(moji_Upper, font=font)
    moji_W = (base_W/2) - (moji_W/2)
    moji_H = hight - moji_H - yohaku
    d.text(( moji_W,moji_H), moji_Upper, font=font, fill='red')

上側の線を描画

続いてラインの描画ですが、Pillowでは、線の描画にはlineというAPIを使用して以下のようにラインを引きます。(そのままですね)
lineの場合、第一引数は、線の先端と終端の座標を、第2引数のfillは色を、第3引数のwidthは線の太さを指定します。
ちなみに、adjustは、線が円からはみ出さないように調整するための引数です。


adjust = 9
hight = (( (base_H-yohaku*2) / 3 ) * 1) + yohaku
d.line([(0+yohaku+adjust,hight),(base_W-yohaku-adjust,hight)],fill='red',width=6)

日付・下側線・下側文字の描画

このあとは、文字の描画と線の描画を繰り返して、日付と下側の文字を描画してあります。

それぞれ、文字の位置や線の位置を計算して調整し、ちょうどよい位置に線や文字がくるようしてあります。
参考にされる方はそのまま使ってもらえればよいと思います。

#日付を入れる
    now = time.localtime()
    date = time.strftime('%y/%m/%d', now) 
    
    fontpath = "C:\Windows\Fonts\msgothic.ttc"
    font = ImageFont.truetype(fontpath, 60)
    moji_W, moji_H = d.textsize(date, font=font)
    moji_W = (base_W/2) - (moji_W/2)
    moji_H = (base_H/2) - (moji_H/2)
    d.text(( moji_W,moji_H), date, font=font, fill='red')
    
    
    #はんこ下部の文字を入れる
    fontpath = "C:\Windows\Fonts\msgothic.ttc"
    font = ImageFont.truetype(fontpath, 60)
    moji_W, moji_H = d.textsize(moji_Lower, font=font)
    moji_W = (base_W/2) - (moji_W/2)
    moji_H = hight + yohaku
    d.text(( moji_W,moji_H), moji_Lower, font=font, fill='red')

ここで、ちょっと違う処理をしているのは日付の取得です。
日付の取得は以下の処理で行っています。

time.strftime APIで現在時刻を指定フォーマットの文字列に変換してあります。


import time
now = time.localtime()
date = time.strftime('%y/%m/%d', now) 

ファイルの保存

ファイルの保存は非常に簡単で、生成したイメージをsave apiでパス指定すれば、ファイルが生成されます。
今回は試していませんが、拡張しをbmp等にすれば保存できるようです。
※ビットマップは透過は対応していませんので、今回の使い方ではpngを使用するのをおすすめします。

image.save(os.getcwd() + '\sample.png')

まとめ

今回は画像の生成に挑戦してみましたが、実に簡単に目的のものが生成できました。
今回思ったのは、処理自体は非常に簡単だけど、画像の配置などをきちんと考えながら設置しないととんでもない画像が出来上がることがありちょっと めんどくさかったかなと思います。
まぁ、趣味でやってみている程度なので、苦労するのも楽しみです。
私が苦労した分この記事を見てくださっている方が楽できればと思いますので、ぜひ引用してつかってください!!!

最後に、Pythonの基礎を学びたい方は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村