[Python] jpgファイルをwebpに変換してファイルサイズを削減する方法
PythonでJPGファイルをWebP形式に変換してファイルサイズを削減するには、Pillowライブラリを使用します。
PillowはPythonの画像処理ライブラリで、JPGやWebPなどの形式に対応しています。
まず、Pillowをインストールし、Image
モジュールを使ってJPGファイルを読み込み、save()メソッド
でWebP形式に変換して保存します。
WebPは圧縮率が高いため、ファイルサイズの削減が期待できます。
Pillowライブラリのインストールと基本設定
Pillowとは?
Pillowは、Pythonで画像処理を行うためのライブラリです。
元々のPIL(Python Imaging Library)の後継として開発され、画像の読み込み、加工、保存などの機能を提供します。
Pillowを使用することで、さまざまな画像フォーマットに対応し、簡単に画像を操作することができます。
特に、WebP形式への変換や、画像のリサイズ、フィルタ適用などが得意です。
Pillowのインストール方法
Pillowは、Pythonのパッケージ管理ツールであるpipを使用して簡単にインストールできます。
以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。
pip install Pillow
インストールが完了したら、Pythonのスクリプト内でPillowをインポートして使用することができます。
Pillowを使った画像ファイルの基本操作
Pillowを使用して画像ファイルを操作する基本的な手順は以下の通りです。
- 画像ファイルを読み込む
- 画像を加工する(リサイズ、回転、フィルタ適用など)
- 加工した画像を保存する
以下は、Pillowを使った基本的な画像操作のサンプルコードです。
from PIL import Image
# 画像ファイルを読み込む
image = Image.open("example.jpg")
# 画像をリサイズする
resized_image = image.resize((800, 600))
# 加工した画像を保存する
resized_image.save("resized_example.jpg")
このコードを実行すると、指定したサイズにリサイズされた画像が保存されます。
WebP形式の特徴と利点
WebPは、Googleが開発した画像フォーマットで、以下のような特徴と利点があります。
特徴・利点 | 説明 |
---|---|
高圧縮率 | JPGやPNGに比べて、同じ画質でファイルサイズが小さくなる。 |
透過性のサポート | PNGのように透過性を持つ画像を扱うことができる。 |
アニメーション | GIFのようにアニメーションをサポートしている。 |
ブラウザの互換性 | 多くの主要なブラウザでサポートされている。 |
WebP形式を使用することで、ウェブサイトの読み込み速度を向上させることができ、ユーザー体験を向上させることが可能です。
JPGからWebPへの変換手順
JPGファイルの読み込み
Pillowを使用してJPGファイルを読み込むには、Image.open()メソッド
を使用します。
このメソッドにJPGファイルのパスを渡すことで、画像をメモリに読み込むことができます。
以下は、JPGファイルを読み込むサンプルコードです。
from PIL import Image
# JPGファイルを読み込む
jpg_image = Image.open("example.jpg")
WebP形式での保存方法
読み込んだJPG画像をWebP形式で保存するには、save()メソッド
を使用します。
このメソッドに保存先のファイル名と拡張子を指定することで、WebP形式で保存できます。
以下は、WebP形式で保存するサンプルコードです。
# WebP形式で保存する
jpg_image.save("converted_image.webp", format="WEBP")
画質を調整してファイルサイズを削減する方法
WebP形式で保存する際に、画質を調整することでファイルサイズを削減できます。
save()メソッド
のquality
パラメータを使用して、画質を指定します。
値は0から100の範囲で、数値が低いほど圧縮率が高くなります。
以下は、画質を調整して保存するサンプルコードです。
# 画質を調整してWebP形式で保存する
jpg_image.save("converted_image_quality.webp", format="WEBP", quality=80)
変換後のファイルサイズの確認方法
変換後のファイルサイズを確認するには、os
モジュールを使用してファイルのサイズを取得します。
os.path.getsize()メソッド
を使用することで、指定したファイルのサイズをバイト単位で取得できます。
以下は、ファイルサイズを確認するサンプルコードです。
import os
# 変換後のファイルサイズを確認する
file_size = os.path.getsize("converted_image_quality.webp")
print(f"変換後のファイルサイズ: {file_size} バイト")
完全なサンプルコード
以下に、JPGファイルをWebP形式に変換し、画質を調整してファイルサイズを確認する完全なサンプルコードを示します。
from PIL import Image
import os
# JPGファイルを読み込む
jpg_image = Image.open("example.jpg")
# WebP形式で保存する(画質80)
jpg_image.save("converted_image_quality.webp", format="WEBP", quality=80)
# 変換後のファイルサイズを確認する
file_size = os.path.getsize("converted_image_quality.webp")
print(f"変換後のファイルサイズ: {file_size} バイト")
このコードを実行すると、指定したJPGファイルがWebP形式に変換され、画質を調整した上でファイルサイズが表示されます。
変換時のオプション設定
画質(quality)パラメータの設定
WebP形式で画像を保存する際、quality
パラメータを使用して画質を調整できます。
このパラメータは0から100の範囲で指定し、数値が高いほど画質が良く、ファイルサイズも大きくなります。
逆に、数値が低いほど圧縮率が高くなり、ファイルサイズは小さくなります。
以下は、画質を設定してWebP形式で保存するサンプルコードです。
from PIL import Image
# JPGファイルを読み込む
jpg_image = Image.open("example.jpg")
# 画質を50に設定してWebP形式で保存する
jpg_image.save("converted_image_quality_50.webp", format="WEBP", quality=50)
圧縮率とファイルサイズの関係
画質を調整することで、圧縮率とファイルサイズの関係を理解することが重要です。
一般的に、画質を下げると圧縮率が上がり、ファイルサイズが小さくなりますが、画質が劣化する可能性があります。
以下の表は、画質とファイルサイズの関係を示しています。
画質 (quality) | 予想されるファイルサイズ (例) |
---|---|
100 | 大(例: 1MB以上) |
80 | 中(例: 500KB程度) |
50 | 小(例: 200KB程度) |
20 | 非常に小(例: 50KB程度) |
このように、画質を調整することでファイルサイズをコントロールできますが、適切なバランスを見つけることが重要です。
透過性のある画像の扱い
WebP形式は透過性をサポートしており、PNG形式のように透明な背景を持つ画像を扱うことができます。
透過性を持つ画像をWebP形式で保存する際は、特に設定を変更する必要はありません。
以下は、透過性のあるPNG画像をWebP形式で保存するサンプルコードです。
# 透過性のあるPNGファイルを読み込む
png_image = Image.open("transparent_image.png")
# WebP形式で保存する
png_image.save("converted_transparent_image.webp", format="WEBP")
メタデータの保持・削除方法
画像には、Exif情報やその他のメタデータが含まれていることがあります。
WebP形式で保存する際に、これらのメタデータを保持するか削除するかを選択できます。
Pillowでは、save()メソッド
のexif
パラメータを使用してメタデータを保持することができます。
以下は、メタデータを保持してWebP形式で保存するサンプルコードです。
# JPGファイルを読み込む
jpg_image = Image.open("example_with_exif.jpg")
# メタデータを保持してWebP形式で保存する
jpg_image.save("converted_with_exif.webp", format="WEBP", exif=jpg_image.info.get('exif'))
メタデータを削除したい場合は、特にexif
パラメータを指定しなければ、デフォルトでメタデータは保存されません。
必要に応じて、メタデータの扱いを調整してください。
複数のJPGファイルを一括でWebPに変換する方法
複数ファイルの読み込み方法
複数のJPGファイルを一括で処理するためには、Pythonのos
モジュールを使用して指定したディレクトリ内のファイルを取得します。
os.listdir()メソッド
を使うことで、ディレクトリ内の全ファイル名をリストとして取得できます。
以下は、特定のディレクトリ内のJPGファイルを読み込むサンプルコードです。
import os
# JPGファイルが格納されているディレクトリのパス
directory_path = "path/to/your/jpg/files"
# ディレクトリ内の全ファイルを取得
jpg_files = [f for f in os.listdir(directory_path) if f.endswith('.jpg')]
ループ処理を使った一括変換
取得したJPGファイルをループ処理で一つずつWebP形式に変換します。
for
ループを使用して、各ファイルを読み込み、変換を行います。
以下は、ループ処理を使った一括変換のサンプルコードです。
from PIL import Image
# JPGファイルを一括でWebP形式に変換
for jpg_file in jpg_files:
# JPGファイルを読み込む
jpg_image = Image.open(os.path.join(directory_path, jpg_file))
# WebP形式で保存する
webp_file_name = jpg_file.replace('.jpg', '.webp')
jpg_image.save(os.path.join(directory_path, webp_file_name), format="WEBP")
変換後のファイル名の自動設定
変換後のファイル名は、元のJPGファイル名を基に自動的に設定できます。
上記のコードでは、.jpg
を.webp
に置き換えることで新しいファイル名を生成しています。
この方法を使うことで、元のファイル名を保持しつつ、拡張子だけを変更することができます。
変換処理の進捗を表示する方法
変換処理の進捗を表示するためには、ループ内で進捗状況を出力することができます。
print()関数
を使用して、現在処理中のファイル名や進捗率を表示することが可能です。
以下は、進捗を表示するサンプルコードです。
# JPGファイルを一括でWebP形式に変換(進捗表示付き)
total_files = len(jpg_files)
for index, jpg_file in enumerate(jpg_files):
# JPGファイルを読み込む
jpg_image = Image.open(os.path.join(directory_path, jpg_file))
# WebP形式で保存する
webp_file_name = jpg_file.replace('.jpg', '.webp')
jpg_image.save(os.path.join(directory_path, webp_file_name), format="WEBP")
# 進捗を表示
print(f"{index + 1}/{total_files} - {jpg_file} を変換しました。")
完全なサンプルコード
以下に、複数のJPGファイルを一括でWebP形式に変換する完全なサンプルコードを示します。
import os
from PIL import Image
# JPGファイルが格納されているディレクトリのパス
directory_path = "path/to/your/jpg/files"
# ディレクトリ内の全JPGファイルを取得
jpg_files = [f for f in os.listdir(directory_path) if f.endswith('.jpg')]
# JPGファイルを一括でWebP形式に変換(進捗表示付き)
total_files = len(jpg_files)
for index, jpg_file in enumerate(jpg_files):
# JPGファイルを読み込む
jpg_image = Image.open(os.path.join(directory_path, jpg_file))
# WebP形式で保存する
webp_file_name = jpg_file.replace('.jpg', '.webp')
jpg_image.save(os.path.join(directory_path, webp_file_name), format="WEBP")
# 進捗を表示
print(f"{index + 1}/{total_files} - {jpg_file} を変換しました。")
このコードを実行すると、指定したディレクトリ内の全てのJPGファイルがWebP形式に変換され、進捗状況が表示されます。
WebP形式の互換性と注意点
WebP形式のブラウザ対応状況
WebP形式は、主要なウェブブラウザで広くサポートされています。
以下は、主要なブラウザのWebP形式の対応状況を示した表です。
ブラウザ名 | 対応状況 |
---|---|
Google Chrome | 対応 |
Mozilla Firefox | 対応 |
Microsoft Edge | 対応 |
Safari | バージョン14以降対応 ※2024年時点で最新バージョンは18 |
Opera | 対応 |
Internet Explorer | 非対応 |
このように、ほとんどの主要なブラウザがWebP形式をサポートしていますが、特に古いバージョンのブラウザやInternet Explorerでは対応していないため、注意が必要です。
WebP形式の画像ビューア対応状況
WebP形式の画像を表示できる画像ビューアも増えてきていますが、すべてのビューアが対応しているわけではありません。
以下は、一般的な画像ビューアのWebP形式の対応状況を示した表です。
画像ビューア名 | 対応状況 |
---|---|
Windows フォト | 対応 |
IrfanView | プラグインが必要 |
GIMP | 対応 |
XnView | 対応 |
Paint | 非対応 |
このように、特定のビューアではプラグインが必要な場合もあるため、使用するソフトウェアの対応状況を確認することが重要です。
WebP形式のデコード速度とパフォーマンス
WebP形式は、JPEGやPNGに比べて高い圧縮率を実現しつつ、デコード速度も優れています。
特に、WebPはロスレス圧縮とロス圧縮の両方をサポートしており、画像の品質を保ちながらファイルサイズを小さくすることが可能です。
デコード速度は、画像のサイズや圧縮率によって異なりますが、一般的にはJPEGと同等かそれ以上の速度でデコードされることが多いです。
これにより、ウェブページの読み込み速度が向上し、ユーザー体験が改善されます。
WebP形式を使用する際の注意点
WebP形式を使用する際には、以下の点に注意が必要です。
- ブラウザの互換性: 古いブラウザや特定の環境ではWebP形式がサポートされていないため、代替フォーマット(JPEGやPNG)を用意することが推奨されます。
- 画像ビューアの対応: 使用する画像ビューアがWebP形式に対応しているか確認する必要があります。
特に、古いソフトウェアでは非対応の場合があります。
- メタデータの扱い: WebP形式では、JPEGやPNGに比べてメタデータの扱いが異なる場合があります。
必要なメタデータが保持されるか確認することが重要です。
- 圧縮設定の調整: 画質を調整する際、圧縮率が高すぎると画質が劣化する可能性があるため、適切な設定を選ぶことが重要です。
これらの注意点を考慮しながらWebP形式を使用することで、より良い画像処理と表示が可能になります。
応用例:WebP変換を自動化するスクリプト
フォルダ内の全画像を自動変換するスクリプト
フォルダ内の全ての画像ファイルを自動的にWebP形式に変換するスクリプトを作成することができます。
以下のコードは、指定したディレクトリ内の全てのJPGファイルをWebP形式に変換する例です。
import os
from PIL import Image
# 変換するJPGファイルが格納されているディレクトリのパス
input_directory = "path/to/your/jpg/files"
# 変換後のWebPファイルを保存するディレクトリのパス
output_directory = "path/to/your/webp/files"
# 出力ディレクトリが存在しない場合は作成
os.makedirs(output_directory, exist_ok=True)
# ディレクトリ内の全JPGファイルを取得
jpg_files = [f for f in os.listdir(input_directory) if f.endswith('.jpg')]
# JPGファイルを一括でWebP形式に変換
for jpg_file in jpg_files:
jpg_image = Image.open(os.path.join(input_directory, jpg_file))
webp_file_name = jpg_file.replace('.jpg', '.webp')
jpg_image.save(os.path.join(output_directory, webp_file_name), format="WEBP")
print(f"{jpg_file} を {webp_file_name} に変換しました。")
このスクリプトを実行すると、指定したフォルダ内の全てのJPGファイルがWebP形式に変換され、指定した出力フォルダに保存されます。
画像のリサイズとWebP変換を同時に行う方法
画像をWebP形式に変換する際に、同時にリサイズも行うことができます。
以下のコードは、全てのJPGファイルを指定したサイズにリサイズしながらWebP形式に変換する例です。
import os
from PIL import Image
# 変換するJPGファイルが格納されているディレクトリのパス
input_directory = "path/to/your/jpg/files"
# 変換後のWebPファイルを保存するディレクトリのパス
output_directory = "path/to/your/webp/files"
# 出力ディレクトリが存在しない場合は作成
os.makedirs(output_directory, exist_ok=True)
# ディレクトリ内の全JPGファイルを取得
jpg_files = [f for f in os.listdir(input_directory) if f.endswith('.jpg')]
# JPGファイルをリサイズしてWebP形式に変換
for jpg_file in jpg_files:
jpg_image = Image.open(os.path.join(input_directory, jpg_file))
# 画像をリサイズ(例: 幅800px、高さ600pxに設定)
resized_image = jpg_image.resize((800, 600))
webp_file_name = jpg_file.replace('.jpg', '.webp')
resized_image.save(os.path.join(output_directory, webp_file_name), format="WEBP")
print(f"{jpg_file} をリサイズして {webp_file_name} に変換しました。")
このスクリプトを実行すると、指定したサイズにリサイズされた画像がWebP形式で保存されます。
変換後のファイルを自動的に別フォルダに保存する方法
変換後のWebPファイルを自動的に別のフォルダに保存する方法は、上記のスクリプトで示した通りです。
出力ディレクトリを指定することで、変換後のファイルを整理して保存できます。
以下は、変換後のファイルを別フォルダに保存するためのコードの一部を再掲します。
# 変換後のWebPファイルを保存するディレクトリのパス
output_directory = "path/to/your/webp/files"
# 出力ディレクトリが存在しない場合は作成
os.makedirs(output_directory, exist_ok=True)
# JPGファイルをWebP形式に変換して別フォルダに保存
for jpg_file in jpg_files:
jpg_image = Image.open(os.path.join(input_directory, jpg_file))
webp_file_name = jpg_file.replace('.jpg', '.webp')
jpg_image.save(os.path.join(output_directory, webp_file_name), format="WEBP")
print(f"{jpg_file} を {webp_file_name} に変換しました。")
このように、出力ディレクトリを指定することで、変換後のファイルを整理して保存することができます。
これにより、元の画像と変換後の画像を分けて管理することが容易になります。
まとめ
この記事では、Pythonを使用してJPGファイルをWebP形式に変換する方法や、Pillowライブラリの基本的な使い方、変換時のオプション設定について詳しく解説しました。
また、複数の画像を一括で変換するスクリプトや、画像のリサイズとWebP変換を同時に行う方法についても触れました。
これらの知識を活用することで、画像のファイルサイズを効率的に削減し、ウェブサイトのパフォーマンスを向上させることが可能です。
ぜひ、実際にスクリプトを試してみて、画像処理の自動化を体験してみてください。