나는 이렇게 학습한다/Etc

Python Pillow를 이용해 이미지에 텍스트 추가하기

daco2020 2024. 8. 22. 00:39
반응형

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단계, 텍스트 추가하기

그 다음으로 해야 할 일은, 이미지 중앙에 텍스트를 추가하는 거겠죠. 여기서는 ImageDrawImageFont를 사용해 텍스트를 그리고, 텍스트의 크기를 조정하겠습니다.

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를 사용해 색상과 텍스트를 추가하고, 행간을 조절하는 방법까지 익혔습니다. 오늘 배운 내용을 활용하면 이미지들을 순식간에 생성할 수 있습니다. 동일한 포맷으로 많은 이미지를 생성해야 할 때, 적극 활용해보시기 바랍니다. 

 

반응형