CodeGym /행동 /Python SELF KO /GIF 및 이미지 처리 자동화

GIF 및 이미지 처리 자동화

Python SELF KO
레벨 46 , 레슨 4
사용 가능

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} 크기가 변경되고 저장되었어.")

이 스크립트는:

  1. input_images 폴더의 모든 파일을 로드.
  2. 각 이미지의 크기를 800x800 픽셀로 변경.
  3. 변경된 이미지를 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}에 워터마크가 추가되었어.")

이 스크립트는:

  1. input_images 폴더의 모든 이미지를 로드.
  2. 각 이미지의 오른쪽 아래 모서리에 텍스트 워터마크를 추가.
  3. 결과를 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)

이 코드는:

  1. frames 폴더에서 이미지를 로드 후 frames 리스트에 추가.
  2. 이 프레임을 사용해 GIF 애니메이션을 생성.
  3. 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)
1
설문조사/퀴즈
이미지 작업 심화, 레벨 46, 레슨 4
사용 불가능
이미지 작업 심화
이미지 작업 심화
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION