【Python】アニメーションGIFの圧縮はpygifsicleで解決

【Python】アニメーションGIFの圧縮はpygifsicleで解決 プログラミング

「PythonでアニメーションGIFの圧縮を行いたい」
「Pillowを使わずにGIF画像を簡単にリサイズしたい」

このような場合には、pygifsicleがオススメです。
この記事では、pygifsicleについて解説しています。

本記事の内容

  • pygifsicleとは?
  • pygifsicleのシステム要件
  • pygifsicleのインストール
  • pygifsicleの動作確認

それでは、上記に沿って解説していきます。

pygifsicleとは?

pygifsicleとは、Gifsicleのラッパーのことです。
Gifsicleは、GIF処理用のコマンドラインツールになります。

そのGifsicleをPythonから操作可能にしたライブラリが、pygifsicleです。
Gifsicleについては、次の記事で説明しています。

「Gifsicleが便利過ぎるのでPythonから使いたい!!」
この要望から生まれたモノが、pygifsicleと言えます。

似たようなライブラリには、ffmpeg-pythonが存在しています。
こちらは、PythonからFFmpegを操作することが可能になります。

以上、pygifsicleについての説明でした。
次は、pygifsicleのシステム要件を確認しましょう。

pygifsicleのシステム要件

現時点(2021年12月)でのpygifsicleの最新バージョンは、1.0.5となります。
この最新バージョンは、2021年10月3日にリリースされています。

サポートOSに関しては、以下を含むクロスプラットフォーム対応です。

  • Windows
  • macOS
  • Linux

そして、サポート対象となるPythonのバージョンはPython 3となります。
バージョンの詳細は、記載されていません。

ラッパーであるため、そんなに複雑なことはしていないのでしょう。
だからこそ、Python 3という適当な記述なのだと思われます。

OSやPythonのバージョンは、それほど重要ではありません。
重要なのは、Gifsicleです。

そのため、事前にGifsicleのインストールを済ませておく必要があります。
正確には、「gifsicle」コマンドが動くことが条件です。

pygifsicleは、あくまでGifsicleのラッパーです。
そのため、「gifsicle」コマンドが動かないとpygifsicleも機能できません。

以上、pygifsicleのシステム要件を説明しました。
次は、pygifsicleをインストールしましょう。

pygifsicleのインストール

検証は、次のバージョンのPythonで行います。

$ python -V
Python 3.9.9

まずは、現状のインストール済みパッケージを確認しておきます。

$ pip list
Package    Version
---------- -------
pip        21.3.1
setuptools 59.5.0
wheel      0.36.2

次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip setuptools

では、pygifsicleのインストールです。
pygifsicleのインストールは、以下のコマンドとなります。

pip install pygifsicle

インストールは、一瞬で終わります。
では、どんなパッケージがインストールされたのかを確認しましょう。

$ pip list
Package    Version
---------- -------
pip        21.3.1
pygifsicle 1.0.5
setuptools 59.5.0
wheel      0.36.2

pygifsicleには、依存するパッケージがありません。
やはり、シンプルな構成です。

だから、Python 3というアバウトなバージョン指定なのでしょう。
依存関係があると、Pythonのバージョンも関係してきますからね。

いづれにせよ、pygifsicleは簡単に既存環境に導入可能です。
依存関係が問題になることは、ありませんので。

以上、pygifsicleのインストールを説明しました。
次は、pygifsicleの動作確認を行います。

pygifsicleの動作確認

pygifsicleの動作確認を行うためには、GIFアニメ画像を用意します。

上記記事から、アニメーションGIFを取得します。
このGIFファイルをtest_1.gif、test_2.gifとします。
両方とも同じファイルです。

test_1.gif、test_2.gif

サイズを確認しておきます。

$ ls -lh test*.gif | awk '{print $9,$5}'
test_1.gif 816K
test_2.gif 816K

圧縮する方法には、2つの方法が存在しています。

  • optimize関数の利用
  • gifsicle関数の利用

それぞれを下記で説明します。

optimize関数の利用

optimize関数の利用は、簡単です。
何も考える必要がありません。

optimize関数を使ってGIFアニメを圧縮するコードは、以下。

from pygifsicle import optimize
optimize("test_1.gif")

上記を実行すると、test_1.gifが上書き保存されています。
再度、サイズを確認します。

$ ls -lh *.gif | awk '{print $9,$5}'
test_1.gif 546K
test_2.gif 816K

サイズが縮小されています。
ただ、これでは少し使い勝手が悪いです。

ファイルを上書きしたくない場合もあるでしょう。
それに、圧縮率が悪いです。

3分の2に圧縮された程度に過ぎません。
そもそも、Gifsicleは3分の1まで圧縮可能です。

gifsicle関数の利用

Gifsicleの性能をフルに活かせるのが、gifsicle関数ということです。

from pygifsicle import gifsicle

gifsicle(
    sources="test_2.gif",
    destination="test_2_dst.gif",
    optimize=False,
    colors=256,
    options=["--optimize=3"]
)

上書きしないように、「destination」を指定しています。
あと、「optimize」が若干ややこしいです。

「optimize=True」であれば、options=[“–optimize=3”]が無効となります。
「optimize=False」であれば、options=[“–optimize=3”]が有効となります。

なお、「optimize=True」の場合にはoptions=[“–optimize=1”]が有効です。
1や3の数字の意味は、以下。

1 Stores only the changed portion of each image. This is the default.
2 Also uses transparency to shrink the file further.
3 Try several optimization methods (usually slower, sometimes better results).

3が、最も圧縮率は高くなります。
では、上記のgifsicle関数のコードを実行しましょう。

結果は、以下となります。

$ ls -lh *.gif | awk '{print $9,$5}'
test_1.gif 546K
test_2.gif 816K
test_2_dst.gif 295K

gifsicle関数を使うと、約3分の1まで圧縮できました。
圧縮できたGIFアニメは、以下のファイルとなります。

test_2_dst.gif

オリジナルのGIFアニメと比べて、どうでしょうか?
違和感を感じますか?

個人的には、全く感じません。
もっと複雑なGIFアニメなら、少しは違和感が出てくるのかもしれません。

でも、3分の1まで圧縮できるなら、利用するしかないでしょう。
GIFを扱うシステムなら、デフォルトでインストールすべきですね。

以上、pygifsicleの動作確認を説明しました。

タイトルとURLをコピーしました