興味の源泉

自分が興味を起こせるようなネタを雑多に書き綴るブログ

【Python】仮画像をまとめて作る

ゲーム制作をしていると、同じルールの仮画像をまとめて作りたくなることがあります。

f:id:nanami_yamato:20200416010117p:plain

filename_001 ~ filename_030 みたいな感じです。

全く同じものならコピーしてリネームでいいのですが、そもそも何個もあるのにリネームすら面倒ですし、何より仮画像といっても識別はしたいわけです。

というわけで今回は画像の上にファイル名を貼り付けた画像をまとめて作るプログラムを書いてみました。

モジュールインポート

Pillowというモジュールを使います。 ファイルを扱うのでosもインポート。

from PIL import Image, ImageDraw, ImageFont
import os

保存フォルダ作成

os.path.isdirで存在確認をした上で存在しなければos.mkdirでフォルダを作成します。

if os.path.isdir(dir_path) == False:
    os.mkdir(dir_path)

ファイル名のフォーマットを作成

ファイル名のフォーマット(ルール)を作成します。

ファイルベース名+連番+拡張子

# format作成 ( 仮に1~30で作成  test_001.png ~ test_030.png )
fmt = ’test_{:03d}.png'
file_name = fmt.format(i) # iは1~30

Imageオブジェクト、ImageDrawオブジェクト取得

画像にあたるImageオブジェクトの取得と画像にテキストを描画するためのImageDrawオブジェクトを取得します。

im = Image.new('RGBA', (width, height), 'gray')
draw = ImageDraw.Draw(im)

ImageFontオブジェクト取得

画像に文字を書くためにフォントとフォントサイズを渡してImageFontオブジェクトを取得します。

arial_font = ImageFont.truetype('arial.ttf', font_size)

文字を描画

文字列とImageFontオブジェクトからテキストのサイズを取得します。

ファイル名を表示したいので、textsize関数にfile_nameを渡しています。

また画像の中心に表示するために画像サイズと文字列のサイズから位置を計算し文字を描画します。

# テキストのサイズを取得し、中心に文字表示
text_width, text_height = draw.textsize(file_name, arial_font)
draw.text((width/2-text_width/2, height/2-text_height/2), file_name, fill='blue', font=arial_font)

画像ファイルの保存

Imageオブジェクトのsaveで画像を保存します。

im.save(dir_path + '\\' + file_name)

まとめ

定数としているものを引数として好きなように渡せば外部から設定できるようにもできます。

これで仮画像を楽に作成することができるようになりました。

from PIL import Image, ImageDraw, ImageFont
import os

dir_path = 'img_dummy'   # ディレクトリパス
file_base_name = 'test_' # ファイル名の接頭文字
digit = 3     # 数字部分の桁数
count = 10    # 作る個数
height = 300  # 画像の高さ
width = 400   # 画像の幅
font_size = 20  # フォントサイズ

# 存在チェック
if os.path.isdir(dir_path) == False:
    os.mkdir(dir_path)

# ファイル生成
for i in range(1, count+1):
    
    # format作成
    #  file_base_name='test_'、digit=3のときは 'test_{:03d}.png' => test_000.png
    fmt = file_base_name + '{:0' + str(digit) + 'd}' + '.png'
    file_name = fmt.format(i)
    
    im = Image.new('RGBA', (width, height), 'gray')
    draw = ImageDraw.Draw(im)
    
    arial_font = ImageFont.truetype('arial.ttf', font_size)
    
    # テキストのサイズを取得し、中心に文字表示
    text_width, text_height = draw.textsize(file_name, arial_font)
    draw.text((width/2-text_width/2, height/2-text_height/2), file_name, fill='blue', font=arial_font)
    
    im.save(dir_path + '\\' + file_name)