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