프로그래밍/C, C++, Java, Python

[Python] 코드로 이미지에 문구 넣기

포도알77 2019. 4. 5. 18:49

 이번 포스트에서는 파이썬과 PILLOW 라이브러리를 이용하여, 백그라운드 이미지에 글자 추가하여 저장하는 프로그램을 담아볼 예정이다.

예전에 로또 당첨 정보를 이미지화하여 출력하는 프로그램을 작성한 적이 있었는데, 이번에는 내 블로그의 BOJ 위키 포스트에 대표 이미지를 문제 번호를 포함하여 출력하여 사용하려고 작성한다.

 

 전체적인 흐름은 1) 백그라운드 이미지 읽기, 2) 이미지에 포함될 글자 생성, 3) 글자 위치 지정, 4) 백그라운드 이미지 + 글자를 파일로 저장하는 과정을 거친다.

 

 이를 위해서는 PIL 라이브러리가 필요하다. 해당 라이브러리는 아래의 명령을 통하여 설치할 수 있다.

sudo apt-get install pillow

 

 

 정상적으로 Pillow 라이브러리를 설치하였다면, 아래의 코드를 Python2에서 실행해보자. 실행에 앞서 이미지 위치나 패스는 직접 설정하자. 

# _*_ coding: utf-8 _*_
import sys
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
im=Image.open("BOJ WIKI.png")
pixelMap = im.load()

newimg = Image.new( im.mode, im.size)
pixelsNew = newimg.load()
for i in range(newimg.size[0]):
    for j in range(newimg.size[1]):
        pixelsNew[i,j] = pixelMap[i,j]
        
font = ImageFont.truetype('font/NanumGothicBold.ttf', 100)
text = unicode("- "+sys.argv[1] + "번 풀이 -", 'utf-8', 'ignore')

size = font.getsize(text)[0]

ImageDraw.Draw(newimg).text(((newimg.size[0]-size)/2,500),text,(0,0,0),
                            font=font)
newimg.convert('RGB').save('result/boj-'+sys.argv[1]+'.jpg')

우선 첫라인의 주석문장은 utf-8으로 코딩되어 있음을 뜻한다. 즉 한글을 출력하기 위한 인코딩 정보를 포함하고 있다

두번째로 sys는 파이썬 프로그램 실행시 입력받은 문제 번호를 읽어오기 위해(sys.argv) 임포트되었다. 그리고 PILLOW 라이브러리에서 Image, ImageDraw, ImageFont를 가져온다.

이 과정이 끝나면 백그라운드 이미지로 사용할 사진을 읽어오고, 새로운 이미지를 생성하여 카피한다.

 

이제 이미지에 쓸 문구를 처리해야 하는데, 폰트 사이즈는 무조건 폰트 변수를 만들어야 변경이 된다. 따라서 나눔고딕 폰트를 받고 크기를 100으로 셋업한다음, 문구를 유니코드로 저장한다.

그 다음 문구를 중앙 정렬하기 위하여 사이즈를 측정하고 ImageDraw.Draw함수를 이용하여 이미지에 덮어쓴다. 이때 첫 매개 변수는 ((문구 시작 X, 문구 시작 Y), 문구, (R, G, B))로 구성되며, font도 함께 전달한다.

 

마지막으로 이미지를 RGB로 바꾸어 jpg 이미지로 저장한다.

 

 

 

페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사