그림에 글씨를 쓰는 간단한 PIL 스크립트

2008/06/21 03:54  로키 TAG
시간이 없어서 많이는 못하고 있지만 계속 생각은 하고 있는 코딩 프로젝트 때문에 이미지를 다루는 파이썬 라이브러리인 PIL (Python Imaging Library)을 사용해 보았다. 여기저기 예시를 참조한 끝에 빈 주사위 그림에 숫자를 그려넣는 스크립트를 만들었다. 아래는 그 스크립트.

#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

이렇게 해놓으면 주사위 그림과 폰트 파일만 있으면 어떤 주사위든 쉽게 만들 수 있다. 이런 거라든지...

사용자 삽입 이미지
뭐 별로 예쁘진 않다. 내게 너무 많은 걸 바라지 말아주길..(..) 하지만 중요한 건 주사위 그림 일일히 만들지 않아도 좋은 주사위 그림만 있으면 쉽사리 숫자를 그려서 만들 수 있다는 점. 다만 그림이 투시도 느낌이 아니면 숫자를 그릴 때 좀 더 정밀한 계산을 해야겠지.

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

Trackback URI

http://lokasenna.pe.kr/blog/trackback/187

  1. 2008/06/21 04:47 PERMALINK EDIT/ERASE REPLY

    힘내십..저도 야근 지겹습 [크흑]


    Ps. PHP 4일 째 모군 [..]

  2. 2008/06/21 14:49 PERMALINK EDIT/ERASE REPLY

    해야 하는 공부니 포기하고 열심히 하십쇼~ ㅇㅅㅇ/

  3. 2010/02/02 17:11 PERMALINK EDIT/ERASE REPLY

    감사합니다.
    많은 도움 받았습니다.

    • 로키
      2010/02/02 21:26 PERMALINK EDIT/ERASE

      다행입니다^^ 정작 저는 코딩에서 손 뗀지 오래돼서 봐도 모르겠지만, @_@ 누군가 도움이 되시는 분이 있다니 좋네요.

    • lhovamp
      2010/02/06 10:23 PERMALINK EDIT/ERASE

      님이 여길 어찌 알고 왔삼?
      이래서 세상이 좁은 건가!

Write a comment

[로그인][오픈아이디란?]

submit