#PIL에서 필요한 모듈 가져오기
from PIL import Image, ImageFont, ImageDraw
#이미지 경로와 폰트 파일 (트루타입) 설정
imgdir = 'images/'
fontfile = 'images/andlso.ttf'
#숫자 파일 만드는 기능
#아래 pasteImg에서 이쪽을 참조하므로 순서상 앞이어야 한다.
#프로젝트에 실제 사용할 때는 클래스라 순서는 상관없겠지만..
def makenumber(string,filename,color,size):
"""
@string: string
@filename: string
@color: hex string
@size: int
"""
#글자체를 트루타입으로 불러온다
font = ImageFont.truetype(fontfile,size)
#글씨의 가로세로를 튜플로 구한다 가로 50, 세로 100이라면 (50, 100) 하는 식으로 나온다
imgsize = font.getsize(string)
#새로운 투명 이미지를 만든다
pic = Image.new("RGBA", imgsize, (0,0,0,0))
draw = ImageDraw.Draw(pic)
#투명 이미지에 지정한 문자열을 지정한 글자체와 색으로 쓴다
draw.text((0,0),string,font=font,fill=color)
#이미지를 지정한 파일명으로 저장하고 파일명 출력
pic.save("%s%s.png" % (imgdir,filename),'png')
return filename
#그림 위에 다른 투명 그림을 덧붙이는 기능
def pasteImg(bgfile,string,filename,color,size,ext,overwrite=False):
"""
@bgfile: string
@string: string
@filename: string
@color: hex
@size: 2-tuple
@ext: string
@overwrite: boolean
"""
#덮어쓰기가 0이면 지정한 숫자 파일이 있나 확인하고 없으면 만듦
if not overwrite:
try:
#숫자파일이 있나 확인하느라 열어보고...
fg = Image.open("%s%s.%s"%(imgdir,filename,ext))
except IOError:
#없어서 에러나면 makenumber를 불러서 숫자 파일 제작
makenumber(string,filename,color,size)
fg = Image.open("%s%s.%s"%(imgdir,filename,ext))
#덮어쓰기가 1이면 무조건 숫자 파일을 만듦
else:
makenumber(string,filename,color,size)
fg = Image.open("%s%s.%s"%(imgdir,filename,ext))
#배경이 될 그림을 열고...
bg = Image.open("%s%s.%s"%(imgdir,bgfile,ext))
#배경 그림과 숫자 그림의 가로세로를 튜플로 낸 후..
W, H = bg.size
w, h = fg.size
#배경과 붙여넣을 그림의 가로세로 차이의 반값을 구해서...
x, y = (W-w)/2, (H-h)/2
#위에서 낸 x, y를 왼쪽 위 구석으로 해서 숫자 파일을 붙여넣음
#뒤에 숫자 파일 핸들러를 다시 지정해주는 건 투명 파일로 붙여넣는 데 필수라고 한다
#이유는 모른다. 그냥 어디 게시판에서 찾은 해결책
bg.paste(fg, (x,y), fg)
#숫자를 붙여넣은 그림을 저장한다
bg.save("%s%s/%s.%s"% (imgdir,bgfile,filename,ext), ext)
#그리고 기능을 사용
#빈 d20 (20면체 주사위) 그림에 1~20까지 숫자를 그려넣은 후
#(글자 크기는 30, 숫자는 검정색)
#images/d20 폴더에 파일명 1png에서 20.png으로 저장
i=1
while i<=20:
pasteImg('d20',str(i),str(i),'#000',30,'png',True)
i = i + 1
이렇게 해놓으면 주사위 그림과 폰트 파일만 있으면 어떤 주사위든 쉽게 만들 수 있다. 이런 거라든지...

한 한 달 전에 만들어놓은 스크립트인데, 이거 보니 다시 코딩하고 싶다..;_; 시험공부 지겨워, 엉엉.




