↓もし、良かったらSNSでの紹介よろしくお願いします。

【Python】Gifを画像に変換、OpenCVとPillow(PIL)を比較

bootstrap

はじめに

今回は、PythonでGif画像を分割して画像に書き出す方法について紹介します。
使うライブラリはOpenCVとPillowの2つを紹介します。

gifのコマを分割する場合、OpenCVのほうが断然オススメです。
OpenCVをPythonにインストールする方法については下記の記事を参考にしてください。

https://www.tech-tech.xyz/python-opencv-pip-install/

Pillow(PIL)だと
「画像によっては変な縞が浮かびかがったり」
「画像の拡張子を指定できなかったり」
するのでおススメしません。

サンプルコード(OpenCV)

OpenCVの動画読み込みの機能を使ってフレームを読み込んで、
フレームを書き出すというコードです。

# -*- coding: utf-8 -*-
import cv2
import os

# Gifファイルを読み込む
gif_file_name = "hoge.gif"
gif = cv2.VideoCapture(gif_file_name)

# スクリーンキャプチャを保存するディレクトリを生成
dir_name = "screen_caps"
if not os.path.exists(dir_name):
    os.mkdir(dir_name)

i = 0
while True:
    is_success, frame = gif.read()

    # ファイルが読み込めなくなったら終了
    if not is_success:
        break

    # 画像ファイルに書き出す
    img_name = str(i) + ".jpg"
    img_path = os.path.join(dir_name, img_name)
    cv2.imwrite(img_path, frame)
    i += 1

サンプルコード(Pillow)

PILのサンプルも紹介します。
コードはOpenCVに比べてシンプルです。

import os
from PIL import Image, ImageSequence

gif_file_name = "hoge.gif"

# スクリーンキャプチャを保存するディレクトリを生成
dir_name = "screen_caps"
if not os.path.exists(dir_name):
    os.mkdir(dir_name)

gif = Image.open(gif_file_name)
for i, f in enumerate(ImageSequence.Iterator(gif)):
    img_name = str(i) + ".png"
    img_path = os.path.join(dir_name, img_name)
    f.save(img_path)