Python에서 Pillow 모듈을 사용한 스프라이트 애니메이션 예제
Pillow 모듈 설치
PIL(Python Image Library) 프로젝트가 중단되고 그 후속 프로젝트가 Pillow 이며 Python 3 이 타겟이다
Pillow 매뉴얼
원문강좌 참조: http://zetcode.com/python/pillow/
Pillow 모듈 설치
Python이 설치되어 있고 PATH 환경변수에 Python의 경로가 설정되어 있다면 윈도우의 CMD 콘솔에서 다음과 같은 명령을 통해 Pillow 모듈을 간단하게 설치할 수 있다
pip install pillow
PIL 이미지를 tk 이미지로 변환하여 tk Canvas에 그리는 예
from tkinter import *
from PIL import Image, ImageTk
master = Tk()
master.title("Canvas에 PIL 이미지 그리기")
master.geometry("600x400+300+100")
master.resizable(False, False)
canvas = Canvas(master, width=600, height=400, bg="orange")
canvas.pack()
pil_img = Image.open("D:/test/explosion17.png")
# 이미지를 다루는 외부 프로그램을 열고 이미지를 보여준다
#pil_img.show()
# PIL 이미지를 tkinter 이미지와 호환되도록 변환
tk_img = ImageTk.PhotoImage(pil_img)
# tkinter Canvas에 이미지를 그린다
image = canvas.create_image(0, 0, anchor=NW, image=tk_img)
master.mainloop()
소스 이미지에서 특정 영역의 이미지 데이터만 가져오기
스프라이트 시트에서 애니메이션의 한 프레임에 해당하는 이미지 영역을 선택적으로 읽어온다
from tkinter import *
from PIL import Image, ImageTk
master = Tk()
master.title("Canvas에 PIL 이미지 그리기")
master.geometry("600x400+300+100")
master.resizable(False, False)
canvas = Canvas(master, width=600, height=400, bg="orange")
canvas.pack()
pil_img = Image.open("D:/test/explosion17.png")
# 스프라이트 시트에서 한 프레임 이미지를 읽어온다
box = 0,0,64,64
pil_frame_img = pil_img.crop(box)
# PIL 이미지를 tkinter 이미지와 호환되도록 변환
frame_img = ImageTk.PhotoImage(pil_frame_img)
# tkinter Canvas에 이미지를 그린다
image = canvas.create_image(0, 0, anchor=NW, image=frame_img)
master.mainloop()
스프라이트 애니메이션을 구현한 예
사용된 스프라이트 시트는 이 페이지 하단에 첨부
from tkinter import *
from PIL import Image, ImageTk
import time
master = Tk()
master.title("스프라이트 애니메이션 예제")
master.geometry("600x400+300+100")
master.resizable(False, False)
canvas = Canvas(master, width=600, height=400, bg="orange")
canvas.pack()
# 애니메이션을 구성하는 모든 프레임 이미지가 저장된 스프라이트 시트를 로드한다
pil_img = Image.open("D:/test/explosion17.png")
# 스프라이트 시트에서 확인된 한 프레임 영역의 폭(w)과 높이(h)
w = 64
h = 64
# 스프라이트 시트로부터 순차적으로 프레임 이미지를 읽어와서 캔바스에 표시한다
for y in range(5) :
for x in range(5) :
# 스프라이트 시트에서 읽어올 한 프레임 영역의 좌표를 계산한다
box = x*w, y*w, (x+1)*h, (y+1)*h
# 스프라이트 시트에서 한 프레임 영역 이미지를 읽어온다
pil_frame_img = pil_img.crop(box)
# PIL 이미지를 tkinter 이미지로 변환한다
frame_img = ImageTk.PhotoImage(pil_frame_img)
# tkinter 이미지를 캔바스에 그린다
image = canvas.create_image(0, 0, anchor=NW, image=frame_img)
# 윈도우(화면)를 업데이트한다
master.update()
# 루프를 0.025초 쉰다(애니메이션 속도를 결정함)
time.sleep(.025)
master.mainloop()