![[파이썬 17] 이미지 크기 조절부터 워터마크까지](https://img.thenullpage.com/posts/5396/5396_1_4ac680.webp)
이미지 크기를 일괄 조정하거나 워터마크를 넣는 작업은 사진 수가 많아질수록 수작업으로는 감당하기 어려워진다. 파이썬에서는 Pillow(PIL의 후속 라이브러리)로 이런 이미지 처리를 자동화할 수 있다.
1. 설치와 이미지 열기/저장
pip install Pillow
python
from PIL import Image
img = Image.open("사진.jpg")
print(img.size, img.format) # (가로, 세로), 파일 형식
Pillow는 PNG, JPEG, GIF, TIFF, BMP 등 널리 쓰이는 이미지 형식 대부분을 지원하며, 여기에 import PIL이 아니라 from PIL import Image로 불러오는 게 관례처럼 쓰인다는 점이 특이하다. 이는 Pillow가 예전 라이브러리인 PIL의 호환 포크로 시작했기 때문이다.
2. 이미지 리사이즈
img = Image.open("사진.jpg")
# 절대 크기로 리사이즈 (비율 무시)
resized = img.resize((300, 200))
# 가로 기준으로 비율 유지하며 리사이즈
new_width = 200
ratio = new_width / img.width
resized = img.resize((new_width, int(img.height * ratio)))
resized.save("사진_리사이즈.jpg")
resize()는 지정한 크기로 강제로 늘리거나 줄이기 때문에, 원본 비율을 그대로 유지하고 싶다면 위 예시처럼 가로/세로 중 하나를 기준으로 비율을 직접 계산해 넣어줘야 한다는 점을 유의해야 한다. 단순히 미리보기용 썸네일이 필요하다면 비율을 자동으로 지켜주는 thumbnail() 메서드를 쓰는 게 더 간편하다.
3. 텍스트 워터마크 넣기
from PIL import Image, ImageDraw, ImageFont
img = Image.open("사진.jpg").convert("RGBA")
draw = ImageDraw.Draw(img)
text = "The Null Page"
font = ImageFont.truetype("arial.ttf", 40)
bbox = draw.textbbox((0, 0), text, font=font)
text_width = bbox[2], bbox[0]
text_height = bbox[3], bbox[1]
margin = 20
position = (img.width, text_width, margin, img.height, text_height, margin)
draw.text(position, text, font=font, fill=(255, 255, 255, 180))
img.save("워터마크_사진.png")
ImageDraw는 이미지 위에 텍스트나 도형을 그리는 역할을 하고, ImageFont는 폰트 파일을 불러와 글씨체와 크기를 지정하는 역할을 한다. fill 값의 네 번째 숫자(180)는 투명도(알파값)로, 0에 가까울수록 투명하고 255에 가까울수록 불투명해진다.
4. 반투명 워터마크, 알파 채널 합성
단순히 텍스트를 이미지 위에 바로 그리면 완전 불투명하게 찍히는데, 은은하게 비치는 반투명 워터마크를 원한다면 별도의 투명 레이어를 만들어 합성하는 방식이 쓰인다.
img = Image.open("사진.jpg").convert("RGBA")
txt_layer = Image.new("RGBA", img.size, (255, 255, 255, 0)) # 완전 투명한 레이어
draw = ImageDraw.Draw(txt_layer)
draw.text((10, 10), "The Null Page", fill=(255, 255, 255, 128), font=font)
watermarked = Image.alpha_composite(img, txt_layer)
watermarked.save("반투명워터마크.png")
5. 실전, 폴더 안 이미지 전체 일괄 처리
이전 편들에서 다룬 os 모듈과 결합하면, 폴더 안의 모든 이미지에 리사이즈와 워터마크를 한 번에 적용하는 스크립트로 확장할 수 있다.
import os
from PIL import Image, ImageDraw, ImageFont
input_folder = "원본사진"
output_folder = "처리된사진"
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.lower().endswith((".jpg", ".jpeg", ".png")):
img = Image.open(os.path.join(input_folder, filename)).convert("RGBA")
img.thumbnail((800, 800)) # 비율 유지하며 축소
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf", 30)
draw.text((10, 10), "The Null Page", fill=(255, 255, 255, 150), font=font)
img.save(os.path.join(output_folder, filename))
6. 정리
Pillow는 이미지를 열고, 크기를 조정하고, 텍스트나 로고를 합성하는 작업을 코드로 처리할 수 있게 해준다. 리사이즈는 비율 유지 여부를 직접 신경 써야 하고, 워터마크는 완전 불투명하게 찍을지 반투명 레이어로 합성할지에 따라 방식이 갈린다는 점이 핵심이다. 여기에 os 모듈을 더하면 폴더 단위 일괄 처리로 확장하기도 어렵지 않다.