今回は、ちょっと会社でデジタルはんこが必要になり、Pythonで作れないかなと挑戦してみたので、その作成したものをシェアしようと思います。
まずは、今回必要となるライブラリです。
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ファイルが生成されます。
続いてプログラムの解説ですが、解説は次ページにて記載します。
このプログラムは実は簡単で、以下のような流れで構成されています。
細かい処理の前に概要を簡単に記載します。
それでは、細かい詳細について説明します。
イメージインスタンスの生成は以下で行っています。
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の基礎を学びたい方は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。
今回は、LangChainとG…