1. 이미지 일괄 처리 자동화
이미지 일괄 처리는 여러 파일에 대해 동일한 작업을 수행하여 시간과 노력을 절약할 수 있어. 예를 들어, 특정 폴더에 있는 이미지의 크기를 변경하거나 워터마크를 추가해야 한다면, Pillow를 사용해서 모든 이미지에 대해 동일한 작업을 수행하는 스크립트를 작성할 수 있어.
폴더 내 모든 이미지 크기 변경
이 예제에서는 input_images 폴더의 모든 이미지 크기를 변경한 후 결과를 output_images 폴더에 저장할 거야.
import os
from PIL import Image
input_folder = "input_images/"
output_folder = "output_images/"
new_size = (800, 800)
# 저장할 폴더가 존재하는지 확인
os.makedirs(output_folder, exist_ok=True)
# input_folder의 모든 파일에 대해 처리
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# 이미지 열고 크기 변경
with Image.open(image_path) as img:
resized_img = img.resize(new_size)
output_path = os.path.join(output_folder, filename)
# 이미지 저장
resized_img.save(output_path)
print(f"이미지 {filename} 크기가 변경되고 저장되었어.")
이 스크립트는:
input_images폴더의 모든 파일을 로드.- 각 이미지의 크기를 800x800 픽셀로 변경.
- 변경된 이미지를
output_images폴더에 저장.
이미지 워터마크 추가
폴더 내 모든 이미지에 워터마크 추가도 손쉽게 자동화할 수 있어. 이 예제에서는 각 이미지의 오른쪽 아래 모서리에 텍스트 워터마크를 추가할 거야.
from PIL import ImageDraw, ImageFont
input_folder = "input_images/"
output_folder = "watermarked_images/"
watermark_text = "© My Company"
# 저장할 폴더가 존재하는지 확인
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# 이미지 열고 드로잉 객체 생성
with Image.open(image_path) as img:
draw = ImageDraw.Draw(img)
width, height = img.size
font = ImageFont.truetype("arial.ttf", 24)
# 워터마크 위치
text_width, text_height = draw.textsize(watermark_text, font=font)
x = width - text_width - 10
y = height - text_height - 10
# 워터마크 추가
draw.text((x, y), watermark_text, font=font, fill=(255, 255, 255, 128))
output_path = os.path.join(output_folder, filename)
img.save(output_path)
print(f"이미지 {filename}에 워터마크가 추가되었어.")
이 스크립트는:
input_images폴더의 모든 이미지를 로드.- 각 이미지의 오른쪽 아래 모서리에 텍스트 워터마크를 추가.
- 결과를
watermarked_images폴더에 저장.
이미지를 PNG 형식으로 변환
모든 이미지를 하나의 형식으로 변환하는 것도 쉽게 자동화할 수 있어. 이 예제에서는 모든 이미지를 PNG 형식으로 변환할 거야.
input_folder = "input_images/"
output_folder = "png_images/"
# 저장할 폴더가 존재하는지 확인
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".bmp", ".tiff")):
image_path = os.path.join(input_folder, filename)
# 이미지 열고 PNG로 변환
with Image.open(image_path) as img:
base_filename = os.path.splitext(filename)[0]
output_path = os.path.join(output_folder, f"{base_filename}.png")
img.save(output_path, "PNG")
print(f"이미지 {filename}가 PNG 형식으로 변환되었어.")
이 스크립트는 JPEG, BMP 및 TIFF 형식의 이미지를 PNG로 변환하고 png_images 폴더에 저장해.
2. GIF 애니메이션 작업
GIF 애니메이션은 여러 이미지를 순차적으로 보여주면서 움직임을 만들어. Pillow를 사용하면 GIF 애니메이션을 생성하고 편집하며, 프레임 추가 및 삭제, 애니메이션 속도 조정 등을 할 수 있어.
간단한 GIF 애니메이션 생성
GIF 애니메이션을 생성하려면 보여줄 여러 이미지(프레임)를 준비해야 해. 이 예제에서는 frames 폴더의 이미지를 사용해 GIF를 만들 거야.
# 애니메이션용 이미지 목록
frames_folder = "frames/"
frames = []
for filename in sorted(os.listdir(frames_folder)):
if filename.endswith((".png", ".jpg")):
frame_path = os.path.join(frames_folder, filename)
frame = Image.open(frame_path)
frames.append(frame)
# 프레임을 GIF 애니메이션으로 저장
frames[0].save("animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
이 코드는:
frames폴더에서 이미지를 로드 후frames리스트에 추가.- 이 프레임을 사용해 GIF 애니메이션을 생성.
duration=100은 각 프레임 표시 시간을 밀리초 단위로,loop=0은 무한 루프를 설정해.
GIF 애니메이션 속도 변경
애니메이션 속도를 변경하려면 duration 값만 변경하면 돼.
# 빠른 속도의 애니메이션 생성
frames[0].save("fast_animation.gif", save_all=True, append_images=frames[1:], duration=50, loop=0)
이 예제에서는 duration=50으로 설정하여 GIF의 재생 속도를 두 배로 빠르게 해.
기존 GIF에 새로운 프레임 추가
기존 GIF를 열고 새로운 프레임을 추가한 후 업데이트된 애니메이션을 저장할 수도 있어.
# 기존 GIF 열기
with Image.open("existing_animation.gif") as gif:
frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]
# 새로운 프레임 추가
new_frame = Image.open("new_frame.png")
frames.append(new_frame)
# 업데이트된 애니메이션 저장
frames[0].save("updated_animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
이 코드는 새 프레임 new_frame.png를 애니메이션의 마지막에 추가해.
GIF 애니메이션에서 프레임 추출
때로는 GIF 애니메이션을 개별 프레임으로 분리해야 할 때가 있어. Pillow는 각 프레임을 별도로 추출하고 저장할 수 있어.
from PIL import ImageSequence
# GIF 애니메이션 열고 프레임 추출
with Image.open("animation.gif") as gif:
for i, frame in enumerate(ImageSequence.Iterator(gif)):
frame.save(f"frame_{i}.png")
이 코드는 애니메이션의 각 프레임을 PNG 형식의 개별 이미지로 저장해.
GIF 애니메이션 및 일괄 처리의 전체 작업 예제
마무리로, 이미지 일괄 처리 자동화와 GIF 작업이 결합된 예제를 제공할게. 여기선 폴더 내 모든 이미지를 크기를 변경한 뒤 GIF 애니메이션을 생성할 거야.
# 이미지 로드, 크기 변경 후 GIF 생성
input_folder = "input_images/"
frames = []
new_size = (400, 400)
for filename in sorted(os.listdir(input_folder)):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
with Image.open(image_path) as img:
resized_frame = img.resize(new_size)
frames.append(resized_frame)
GO TO FULL VERSION