[Python] jpgファイルをwebpに変換してファイルサイズを削減する方法

PythonでJPGファイルをWebP形式に変換してファイルサイズを削減するには、Pillowライブラリを使用します。

PillowはPythonの画像処理ライブラリで、JPGやWebPなどの形式に対応しています。

まず、Pillowをインストールし、Imageモジュールを使ってJPGファイルを読み込み、save()メソッドでWebP形式に変換して保存します。

WebPは圧縮率が高いため、ファイルサイズの削減が期待できます。

この記事でわかること
  • Pillowライブラリの基本的な使い方
  • JPGからWebPへの変換手順
  • 画像のリサイズと圧縮設定
  • WebP形式の互換性と注意点
  • 自動化スクリプトの作成方法

目次から探す

Pillowライブラリのインストールと基本設定

Pillowとは?

Pillowは、Pythonで画像処理を行うためのライブラリです。

元々のPIL(Python Imaging Library)の後継として開発され、画像の読み込み、加工、保存などの機能を提供します。

Pillowを使用することで、さまざまな画像フォーマットに対応し、簡単に画像を操作することができます。

特に、WebP形式への変換や、画像のリサイズ、フィルタ適用などが得意です。

Pillowのインストール方法

Pillowは、Pythonのパッケージ管理ツールであるpipを使用して簡単にインストールできます。

以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。

pip install Pillow

インストールが完了したら、Pythonのスクリプト内でPillowをインポートして使用することができます。

Pillowを使った画像ファイルの基本操作

Pillowを使用して画像ファイルを操作する基本的な手順は以下の通りです。

  1. 画像ファイルを読み込む
  2. 画像を加工する(リサイズ、回転、フィルタ適用など)
  3. 加工した画像を保存する

以下は、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} に変換しました。")

このように、出力ディレクトリを指定することで、変換後のファイルを整理して保存することができます。

これにより、元の画像と変換後の画像を分けて管理することが容易になります。

よくある質問

WebPに変換すると画質が劣化しますか?

WebP形式に変換する際、画質が劣化するかどうかは、使用する圧縮設定に依存します。

WebPはロスレス圧縮とロス圧縮の両方をサポートしており、ロスレス圧縮を使用すれば画質を保ったままファイルサイズを削減できます。

しかし、ロス圧縮を使用する場合、画質が劣化する可能性があります。

画質を調整するためのqualityパラメータを適切に設定することで、画質とファイルサイズのバランスを取ることが重要です。

一般的には、画質を80程度に設定することで、目に見える劣化を避けつつファイルサイズを削減できます。

WebP形式はすべてのブラウザで表示できますか?

WebP形式は多くの主要なブラウザでサポートされていますが、すべてのブラウザで表示できるわけではありません。

具体的には、Google Chrome、Mozilla Firefox、Microsoft Edge、Operaなどの最新のブラウザではWebP形式がサポートされていますが、Internet Explorerや古いバージョンのSafariでは非対応です。

したがって、WebP形式の画像を使用する際は、代替フォーマット(JPEGやPNG)を用意することが推奨されます。

特に、ユーザーのブラウザ環境を考慮して、適切なフォールバックを用意することが重要です。

JPGからWebPに変換してもファイルサイズがあまり減りません。

なぜですか?

JPGからWebPに変換してもファイルサイズがあまり減らない理由はいくつか考えられます。

まず、元のJPG画像の画質や内容によっては、WebP形式に変換してもファイルサイズが大きくならない場合があります。

特に、元の画像がすでに圧縮されている場合、WebP形式に変換しても大幅なサイズ削減が見込めないことがあります。

また、WebP形式の圧縮設定(qualityパラメータ)を適切に調整しないと、期待するファイルサイズの削減が得られないこともあります。

画質を下げることでファイルサイズを小さくすることが可能ですが、画質の劣化に注意が必要です。

最適な圧縮設定を見つけるために、いくつかの設定を試してみることをお勧めします。

まとめ

この記事では、Pythonを使用してJPGファイルをWebP形式に変換する方法や、Pillowライブラリの基本的な使い方、変換時のオプション設定について詳しく解説しました。

また、複数の画像を一括で変換するスクリプトや、画像のリサイズとWebP変換を同時に行う方法についても触れました。

これらの知識を活用することで、画像のファイルサイズを効率的に削減し、ウェブサイトのパフォーマンスを向上させることが可能です。

ぜひ、実際にスクリプトを試してみて、画像処理の自動化を体験してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す