Python Pillow를 이용해 이미지에 텍스트 추가하기
Pillow는 Python에서 이미지를 다룰 수 있게 해주는 라이브러리입니다. 원래는 Python Imaging Library(PIL)라는 이름으로 시작했는데, 현재는 Pillow라는 이름으로 널리 사용되고 있죠. 이 라이브러리는 이미지를 생성, 수정, 변환, 필터링하는 등 다양한 이미지 처리 기능을 제공합니다.
위의 이미지는 Pillow를 이용해 만든 이미지입니다. 이번 글에서는 위의 이미지 처럼 정사각형 이미지에 텍스트를 입히는 과정을 3단계로 설명하겠습니다 :)
1단계, 네모 박스에 색상 채우기
먼저 Pillow를 사용해 이미지를 생성하는 것부터 시작하겠습니다. 아래 예제 코드를 통해 이미지의 크기와 배경색을 지정해주면, 네모난 박스에 원하는 색상을 채워줄 수 있습니다.
from PIL import Image
# 이미지 크기와 배경색 지정
img_size = (1000, 1000)
color_code = "#0A0E3F"
img = Image.new("RGB", img_size, color=color_code)
# 이미지를 저장합니다.
img.save("image.png")
이렇게 하면 1000x1000 크기의 이미지를 만들고, 배경색을 color_code
에 지정한 색상으로 채우게 됩니다. 이 단계는 단순히 네모난 박스를 만들어 놓는 작업입니다.
이미지 생성 결과물
2단계, 텍스트 추가하기
그 다음으로 해야 할 일은, 이미지 중앙에 텍스트를 추가하는 거겠죠. 여기서는 ImageDraw
와 ImageFont
를 사용해 텍스트를 그리고, 텍스트의 크기를 조정하겠습니다.
from PIL import ImageDraw, ImageFont
# ImageDraw 객체는 이미지를 수정하거나 그림을 그리는 데 사용합니다.
draw = ImageDraw.Draw(img)
# ImageFont.truetype()은 지정한 경로의 TrueType 폰트 파일을 로드합니다.
# 이때 두 번째 인자인 72는 폰트 크기를 나타냅니다.
font = ImageFont.truetype("font/Pretendard-SemiBold.ttf", 72)
# 이미지에 그릴 텍스트 내용입니다.
message = "이 별들은 모두 너를 위해\n빛나고 있는 것이다."
# bbox 를 이용해 텍스트의 넓이와 높이를 구합니다.
bbox = draw.textbbox((0, 0), message, font=font)
text_width, text_height = bbox[2] - bbox[0], bbox[3] - bbox[1]
# 텍스트를 이미지 중앙에 배치하기 위해 텍스트 시작 좌표를 계산합니다.
position = ((img_size[0] - text_width) // 2, (img_size[1] - text_height) // 2)
# 텍스트를 그려넣습니다.
draw.text(position, message, fill="#ffffff", font=font)
# 이미지를 저장합니다.
img.save("image.png")
이렇게 하면, "이 별들은 모두 너를 위해 빛나고 있는 것이다." 라는 텍스트가 이미지 중앙에 흰색으로 그려지게 됩니다.
이미지 생성 결과물
3단계, 행간 및 정렬 조절하기
앞서의 결과만으로도 괜찮지만, 행간이 좁아 답답한 느낌이 듭니다. 이번에는 행간을 추가하고 문장이 가운데로 정렬되도록 해보겠습니다. 이를 위해서 기존의 draw.text 메서드를 draw.multiline_text 메서드로 변경합니다.
# 높이를 의미하는 두 번째 값에 -48 을 추가하여 spacing 만큼 더 위에 위치하도록 수정합니다.
position = ((img_size[0] - text_width) // 2, (img_size[1] - text_height) // 2 - 48)
# draw.text(position, message, fill="#ffffff", font=font) 대신 아래 코드를 입력합니다.
draw.multiline_text(
position, message, fill="#ffffff", font=font, spacing=48, align="center"
)
draw.multiline_text 메서드에서 spacing 은 행간의 정도를 조절할 수 있고, align 을 추가해 가운데 정렬도 할 수 있습니다. 이때, position 값의 y축 값도 spacing 만큼 빼야(여기서는 -48) 텍스트가 정 가운데에 위치할 수 있으니 주의해주세요.
이미지 생성 결과물
완성된 전체 코드는 다음과 같습니다.
from PIL import Image, ImageDraw, ImageFont
img_size = (1000, 1000)
color_code = "#0A0E3F"
img = Image.new("RGB", img_size, color=color_code)
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("font/Pretendard-SemiBold.ttf", 72)
message = "이 별들은 모두 너를 위해\n빛나고 있는 것이다."
bbox = draw.textbbox((0, 0), message, font=font)
text_width, text_height = bbox[2] - bbox[0], bbox[3] - bbox[1]
spacing = 48
position = ((img_size[0] - text_width) // 2, (img_size[1] - text_height) // 2 - spacing)
draw.multiline_text(
position, message, fill="#ffffff", font=font, spacing=spacing, align="center"
)
img.save("image.png")
마무리
Pillow를 사용해 색상과 텍스트를 추가하고, 행간을 조절하는 방법까지 익혔습니다. 오늘 배운 내용을 활용하면 이미지들을 순식간에 생성할 수 있습니다. 동일한 포맷으로 많은 이미지를 생성해야 할 때, 적극 활용해보시기 바랍니다.