Pythonのライブラリ「Pillow」を使ってJPEGやPNGの画像を「WebP」に変換する方法を解説します。
また、エラーが出てWebPに変換できない場合の対処法についても説明します。
- PillowでWebPに変換する方法
- エラーが出た場合の対処法
- JPEG・PNGをWebPに変換した場合の圧縮率
WebPとは
「WebP」はJPEGやPNGと比較して画質を維持しつつ、圧縮率を高くできる次世代画像フォーマットです。
WebP形式の画像をサイトに使うことで、ページの読み込みを高速化することができます。
Webpについて、WebPへの変換方法については以下の記事を参考にしてください。
WebP(ウェッピー)とは? メリット・デメリットやPNG・JPEGからの変換方法を解説WordPressの場合はプラグインを使うことで簡単にWebPに変換できます。
WordPressを使用している方は以下の記事を参考にしてみてください。
EWWW Image OptimizerでJPEG・PNGをWebPに変換PillowでWebPに変換する方法
まずはPillowをインストールします。
$ pip install Pillow
今回は、以下のディレクトリの構成で作業しています。
「original」フォルダに変換前の元画像「iPhone.JPG」を入れており、変換後のWebP画像を「convert」フォルダに入れます。
WebP/
├ WebP.py
├ original/
│ └ iPhone.JPG
└ convert/ └ iPhone.webp //ここにwebp変換した画像を入れます
WebP変換を行うコードは以下です。
from PIL import Image
img = Image.open('./original/iPhone.JPG')
img.save('./convert/iPhone.webp')
これだけで簡単にWebPに変換できます。
できるはずでしたが、私の場合はエラーが出てwebpには変換できませんでした。
以下では、私が出たエラー内容と対処方法について説明します。
「KeyError: ‘webp’」というエラーが出てwebpに変換できない
私は上記の方法でwebpに変換しようとしましたが、以下のエラーが出てできませんでした。
save_handler = SAVE[format.upper()]
KeyError: 'webp'
私の作業環境は以下です。
anacondaを入れており、Pillowはあらかじめ入っていました。
- Windows10 Home 64ビット
- anaconda 4.9.0
- python 3.8.3
- Pillow 7.2.0
ちなみにwebpへの変換ではなく、JPEGやPNGへの変換はできました。
少し話はそれますが、JPEGやPNGへの変換は上記のWebPへの変換コードの拡張子を.webpから.jpgや.pngに変更すればできます。
ただし、PNG→JPEGに変換する場合は以下のように.convert('RGB')
を付けないとエラーが出ます。
from PIL import Image
img = Image.open('./original/iPhone.png').convert('RGB')
img.save('./convert/iPhone.jpg')
対処方法「Pillowを再インストール」
いろいろと調べて試しても駄目でしたが、Pillowを一度アンインストールして再インストールするとWebPに変換できました。
$ pip uninstall Pillow
アンインストールしたPillowのバージョンは、7.2.0でした。
Uninstalling Pillow-7.2.0:
$ pip install Pillow
再インストールしたPillowのバージョンは、8.3.1でした。
Successfully installed Pillow-8.3.1
JPEG・PNGの画像をWebPに変換して圧縮率を確認
JPEGとPNGの画像をWebPに変換して、圧縮率を確認してみます。
JPEG画像は、iPhoneで撮影した以下の画像を使用します。画像サイズは3.40MBです。
(以下の画像はWordPressのプラグインで圧縮後の画像なので、オリジナル画像ではありません。)
PNG画像は、いらすとやでダウンロードした以下の画像を使用します。
画像サイズは512KBです(以下の画像はWordPressのプラグインで圧縮後の画像なので、オリジナル画像ではありません)。
JPEG → WebP の圧縮結果
JPEG画像をWebPとPNGに変換した結果は以下です。
画像フォーマット | 画像サイズ | 圧縮率 |
---|---|---|
JPEG(オリジナル) | 3.40MB | – |
WebP | 971KB | 71.4% |
PNG | 11.6MB | 241% |
JPEGをWebPに変換することで大きく圧縮することができました。
見た目の差はほぼわかりません。
JPEGをPNGに変換すると、画像サイズが大きくなってしまいます。
PNG → WebP の圧縮結果
PNG画像をWebPとJPEGに変換した結果は以下です。
画像フォーマット | 画像サイズ | 圧縮率 |
---|---|---|
PNG (オリジナル) | 512KB | – |
WebP | 41.3KB | 91.9% |
JPEG | 71.2KB | 86.1% |
JPEGに変換した場合よりも、WebPに変換した方が圧縮率を高くすることができます。
見た目の差はほぼわかりません。
Pillowを使って画像をまとめてリサイズする方法は下記の記事に書いているので、参考に見てください。
【Pillow】Pythonで画像をまとめてリサイズ・圧縮!WebPにも変換可能【コピペでOK】