pypy.com/

Python、Unity、FX自動化などを勉強しています。あと、コーラと車も好きです。そこらへんについて、たまに記事を書きます。

PythonでPNG・JPGからWebPに変換する(PIL・Pillow)

f:id:SaidaTaisei:20220123164223p:plain こんにちは。

今回は、PythonでPIL(Pillow)をつかって、PNGやJPG(JPEG)からWebPへの変換をしたいと思います。

WebPに変換する理由としては、画像の容量の低減であることが多いと思います。

本ブログでも、少しでも早く表示できるように、最近は画像をWebPで貼っています。

それでは書いていきます。

PNG/JPGからWebPへの変換(PIL・Pillow)

ここでは、PNG/JPGからWebPへと変換します。
基本的には、PILでの保存の時にフォーマットを指定することで、webp形式で保存することができます。
pngでもjpgでも、読み込みの時のファイルパスが変わるだけで、他は同じです。

from PIL import Image

img_file_name = "test.jpg"
save_file_name = "test.webp"
img = Image.open(img_file_name).convert("RGB")
img.save(save_file_name, "webp")

実行して、得られた画像(.webp)と最初の画像(.jpg)を比べてみます。
左にJPEG画像、右にWebP画像を貼ります。

見た目では、ほとんど変わっていないことがわかります。
ここで、画像の容量ですが、以下のようになっており、webp形式とjpegで同じくらいのサイズでした。

  • jpg: 92.1 KB
  • webp: 92.2 KB

さらに画像容量を小さくする

先ほどの結果だと、jpgとwebpでほとんど同じサイズとなりました。
しかし、これではwebpにするメリットがありません。
そこで、さらに画像の容量を小さくします。

Pillowでは、saveするときに、拡張子ごとにいくつかのパラメータを追加で設定できます。
WebP形式での保存では、以下のパラメータでさらに容量を小さくできます。

  • quality: 品質
    これには1~100を設定します。(100の方が高画質です)
  • method: 速度と品質のバランス
    これには0~6を設定します。
    6の方が遅いですが、容量は小さくできます。
    遅いと言いましたが、そんなに気になるほどは遅くはないです。

今回は、qualityを75、methodを6でやってみます。
(当ブログのwebpもそれで作っています)

コードは以下のようになります。

from PIL import Image

img_file_name = "test.jpg"
save_file_name = "test.webp"
img = Image.open(img_file_name).convert("RGB")
img.save(save_file_name, "webp", quality=75, method=6)

このコードで作った、画像が以下のようになります。
左がjpg、右がwebpです。

見ると分かるように、見た目はほとんど変わりません

この画像の容量ですが、以下のようになりました。

  • jpg: 92.1 KB
  • webp: 72.6 KB

webpの方が、小さいサイズになっていることがわかります。

今回は、PythonでPILを使って、JPGやPNGをWebPへ変換する方法を紹介しました。
今は、JPGの方が主流ですが、これからWebPが多くなってくると思われますので、覚えておいて損はないと思います。