Start_python’s diary

ふたり暮らし

アラフィフ夫婦のフリーランスプラン

Python GIFファイルの読み込み・編集・表示・書き込み

はじめに

GIFファイルを編集するための準備を行います。GIFの読み込み、表示、書き込みの基本を勉強していきます。GIFの読み込み方は「OpenCV」と「Pillow(PIL)」がありますが、「OpenCV」が編集しやすそうなのでこちらを利用します。

 

モジュールのインポート

import cv2
import numpy as np
from moviepy.editor import ImageSequenceClip

 

今回はOpenCVを使います。numpyは編集用です。ImageSequenceClipは保存時に使います。

 

GIFファイルの読み込み

gif = cv2.VideoCapture('sample.gif')
fps = gif.get(cv2.CAP_PROP_FPS)  # fpsは1秒あたりのコマ数

 

ファイル名を指定して変数「gif」で読み込みます。一緒にfpsを読み込んでおきます。

 

編集

images = []
i = 0
while True:
    is_success, img = gif.read()
    if not is_success:
        break

    images.append(img)
    i += 1

 

リスト「images」を作ります。

is_success, img = gif.read()

read()メソッド:
返り値は「画像が読み込めたかどうかを示すbool値」と「画像の配列ndarray」

変数「img」は1コマの画像データです。3次元配列で(横、縦、色情報)です。

1コマずつリスト「images」に追加していきます。

「images」は4次元配列で(画像番号、横、縦、色情報)です。

例えば、images[0]でい1コマ目の画像データ(3次元配列)が抽出できます。

 

表示

cv2.namedWindow('test', cv2.WINDOW_AUTOSIZE)

for t in range(len(images)):
    cv2.imshow('test', images[t])
    cv2.waitKey(int(1000/fps))  # 1コマを表示するミリ秒

cv2.destroyAllWindows()

 

cv2.namedWindow('test', cv2.WINDOW_AUTOSIZE)

「'test'」はウィンドウの名前、「cv2.WINDOW_AUTOSIZE」はサイズ固定です。元のサイズが大きすぎる場合は「cv2.WINDOW_NORMAL」に変えたほうがいいです。

cv2.imshowで「images」を1コマずつ抽出して表示します。

cv2.waitKeyで、fpsに応じて表示する時間を決めます。

cv2.destroyAllWindows()で、ウィンドウを閉じます。

 

書き込み

images = np.array(images)
images = images[:, :, :, [2, 1, 0]]    # BGR <-> RGB
images = list(images)

clip = ImageSequenceClip(images, fps=fps)
clip.write_gif('test.gif')

 

np.array()は、リスト(配列)を計算しやすくするという解釈でいいでしょうか。

images = images[:, :, :, [2, 1, 0]]

色情報だけ順番を変えます。(赤, 緑, 青) を (青, 緑, 赤) の順に変えています。

list()で、保存するためにリスト型に変えています。

fpsを設定してから、ファイル名を指定して保存します。

 

まとめ

なんとなく流れは理解できました。重要なのは「編集」のところで画像データを変更して切り取りしたりトリミングしたり出来そうです。次回は、GIFアニメーションTwitterに張り付けるため)に変更できるようにしたいと思います。

 

 

保存ファイル

lesson75.py

 

 

文責:Luke