[Python] Pillow에서 애니메이션 GIF의 크기 조정

최근에 GIF 애니메이션의 크기를 통일적으로 조정하는 일이 있었는데 그때 프로그램의 메모였다.
sample.gif

01. 절차


from PIL import Image

# アニメーションGIFを読み込む
image = Image.open("sample.gif")

# 幅と高さを取得
width, height = image.size

# アニメーションの各フレームをリサイズしてリストに格納
resize_image_list = []
for index in range(image.n_frames):
    image.seek(index)
    resize_image_list.append(image.resize((width // 2, height // 2)))

# アニメーションGIFとして書き出し
resize_image_list[0].save(
    "resize_sample.gif",
    save_all=True,
    append_images=resize_image_list[1:],
    loop=0,
)

02. 해설


02-01.파일 형식


보충 설명을 좀 쓰겠습니다.
애니메이션 GIF는 Pillow로 열면 "PIL.GifImagePlugin.GifImageFile"형식으로 읽습니다. ※jpg와 bmp 등은 "PIL.Image.Image"
image = Image.open("sample.gif")
print(image)
<PIL.GifImagePlugin.GifImageFile image mode=P size=200x113 at 0x29888A333D0>
"PIL.GifImagePlugin.GifImageFile"은 여러 "PIL.Image.Image"가 포함된 형식입니다. n프레임 참조를 통해 장수를 확인할 수 있습니다.
print(image.n_frames)
50
tell()를 사용하면 현재 참고할 프레임 인덱스를 얻을 수 있습니다.
읽기 상태는 첫 번째 프레임이므로 0입니다.
print(image.tell())
0
seek()를 사용하면 참고 프레임을 변경할 수 있습니다.
image.seek(20)
print(image.tell())
20
이미지에 액세스한 후 참조 프레임을 "PIL.Image.Image"로 처리합니다.
resize_image = image.resize((100, 100))
print(resize_image)
<PIL.Image.Image image mode=P size=100x100 at 0x1BD415F7F10>
애니메이션 GIF 읽기
이렇게 처리하면 첫 번째 프레임만 처리하면 애니메이션이 아니다.
image = Image.open("sample.gif")
print(image.tell())
print(image)
resize_image = image.resize((100, 100))
print(resize_image)
0
<PIL.GifImagePlugin.GifImageFile image mode=P size=200x113 at 0x29888A333D0>
<PIL.Image.Image image mode=P size=100x100 at 0x1BD415F7F10>

02-02.크기 조정


애니메이션 GIF의 크기를 조정하려면 프레임을 다룹니다.
# 幅と高さを取得
width, height = image.size

# アニメーションの各フレームをリサイズしてリストに格納
resize_image_list = []
for index in range(image.n_frames):
    image.seek(index)
    resize_image_list.append(image.resize((width // 2, height // 2)))

02-03.보존


애니메이션 GIF로 다시 저장합니다.
첫 번째 프레임에save()를 사용하고 end를 적용합니다 -이미지 옵션을 사용하여 나머지 프레임을 지정합니다.
save_모든 그림을 all로 저장하고 loop으로 애니메이션 순환 횟수를 지정합니다 (0은 무한 순환)
자세한 내용은 공식 문서에서 →Image file formats — Pillow (PIL Fork) documentation
# アニメーションGIFとして書き出し
resize_image_list[0].save(
    "resize_sample.gif",
    save_all=True,
    append_images=resize_image_list[1:],
    loop=0,
)
보충:
완성된 GIF가 잘 표시되지 않을 때는 False를 통해 최적화 옵션(optimize)을 표시하는 경우도 있다.
# アニメーションGIFとして書き出し
resize_image_list[0].save(
    "resize_sample.gif",
    save_all=True,
    append_images=resize_image_list[1:],
    loop=0,
    optimize=False,
)
이상.

좋은 웹페이지 즐겨찾기