画像フォーマットの中でも、WebPとJPEGはそれぞれ異なる特性を持つため、用途に応じて使い分けることが求められます。特にWebPは高い圧縮率で画像品質を保つことができるため、ウェブでの利用に適していますが、すべての環境でサポートされているわけではありません。そのため、JPEG形式に変換する必要が生じることもあります。この記事では、Pythonの強力な画像処理ライブラリであるPillowを使って、WebP画像をJPEGに簡単に変換する方法を解説します。Python初心者でも理解しやすいように、ステップバイステップでプログラムの実装方法を紹介しますので、ぜひご参考にしてください。
1. PythonでWebP画像をJPEGに変換する方法
ここからはPyshonで変換プログラムを実装するにあたって前提となる知識やライブラリについて解説します。
1-1. WebPとJPEGの違いとは?
WebPとJPEGはどちらも画像ファイル形式ですが、それぞれ特有の特徴と用途があります。WebPはGoogleが開発した画像フォーマットで、主にウェブでの使用を目的としています。WebPは優れた圧縮効率を持ち、高品質を保ちながらファイルサイズを小さくすることができます。このため、ページの読み込み速度を向上させるために、ウェブサイトでよく使われます。一方、JPEGは長らく標準的な画像フォーマットとして使われてきた形式で、高い互換性を持ちます。JPEGは多くのアプリケーションやデバイスでサポートされており、写真などのフルカラー画像に適しているため、広く普及しています。
1-2. なぜWebPからJPEGに変換するのか?
WebPは優れた圧縮性能を持っていますが、すべてのデバイスやアプリケーションがWebP形式をサポートしているわけではありません。そのため、互換性の問題が発生することがあります。特に古いブラウザや一部の画像ビューアーではWebP形式を表示できないことがあります。これに対し、JPEGはほぼすべてのプラットフォームでサポートされているため、幅広い環境で画像を共有する際にはJPEGに変換する方が便利です。例えば、機械学習プロジェクトでデータセットを構築する際、JPEG形式を要求するツールやライブラリを使用している場合には、WebP画像をJPEGに変換する必要があります。
1-3. Pythonで画像変換を行うメリット
Pythonで画像変換を行う最大のメリットは、その簡潔さと強力なライブラリの存在です。PythonにはPillowやOpenCVなど、画像処理を効率的に行うための豊富なライブラリがあります。これらのライブラリを使用することで、数行のコードで画像の変換、リサイズ、フィルタリングなどの処理を実装できます。さらに、Pythonはスクリプト言語であるため、シェルスクリプトのように複雑なインストール手順や設定を必要とせず、コードをそのまま実行できます。また、Pythonは自動化やバッチ処理が得意であり、複数の画像を一括で処理する場合にも非常に便利です。
1-4. PythonのライブラリPillowについて
PillowはPythonで画像処理を行うための代表的なライブラリで、PIL(Python Imaging Library)の後継として開発されました。Pillowは様々な画像形式の読み書きに対応しており、WebP、JPEG、PNG、GIFなど多くのフォーマットをサポートしています。また、画像のリサイズ、クロップ、フィルタリング、テキストの描画など、豊富な機能を提供しています。特に、WebP形式の画像をJPEGに変換する場合でも、Pillowを使えば簡単に実装できます。機械学習やデータ分析の分野でも、画像データの前処理や可視化に利用されることが多いライブラリです。
1-5. Pillowのインストール方法
Pillowを使用するには、まずPython環境にインストールする必要があります。PillowはPython Package Index(PyPI)に登録されているため、pipコマンドを使って簡単にインストールできます。以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。
pip install pillow
このコマンドを実行すると、Pillowが自動的にダウンロードされ、Python環境にインストールされます。インストールが完了したら、import
文を使ってプログラム内でPillowを使用できるようになります。
2. WebPからJPEGへの変換コードの解説
2-1-1. 必要なライブラリのインポート
import os
from PIL import Image
この部分では、必要なライブラリをインポートしています。os
モジュールは、ディレクトリやファイルの操作に使用します。PIL
(Python Imaging Library)はPillowの主要モジュールで、Image
クラスを使って画像の読み書きを行います。
2-1-2. 変換関数の定義
def convert_webp_to_jpeg(source_dir, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
convert_webp_to_jpeg
関数は、WebP画像をJPEGに変換する処理を行うメイン関数です。この関数は、source_dir
(変換元のディレクトリ)とoutput_dir
(変換後のJPEG画像を保存するディレクトリ)の2つの引数を取ります。os.path.exists(output_dir)
は、出力先ディレクトリが存在するかどうかをチェックし、存在しない場合はos.makedirs(output_dir)
で新しいディレクトリを作成します。
2-1-3. WebP画像の検索
files = os.listdir(source_dir)
webp_files = [file for file in files if file.lower().endswith('.webp')]
この部分では、os.listdir(source_dir)
で指定されたディレクトリ内のすべてのファイルを取得し、リストに格納します。その後、リスト内包表記を使用して、.webp
拡張子で終わるファイル(WebP画像)のみを抽出し、webp_files
リストに格納します。
2-1-4. 画像の変換処理
for file_name in webp_files:
webp_path = os.path.join(source_dir, file_name)
jpeg_name = os.path.splitext(file_name)[0] + '.jpeg'
jpeg_path = os.path.join(output_dir, jpeg_name)
このループでは、webp_files
リスト内の各WebP画像ファイルに対して変換処理を行います。os.path.join(source_dir, file_name)
で各画像ファイルの完全なパスを取得し、os.path.splitext(file_name)[0]
で拡張子を除いたファイル名を取得します。これに.jpeg
を追加してJPEG形式のファイル名を作成し、出力ディレクトリに保存するための完全なパスをjpeg_path
として生成します。
2-1-5. WebPからJPEGへの変換
try:
with Image.open(webp_path) as img:
rgb_img = img.convert('RGB')
rgb_img.save(jpeg_path, 'JPEG')
except Exception as e:
print(f"変換失敗: '{file_name}' - エラー: {e}")
try
ブロックの中で、Image.open(webp_path)
を使用してWebP画像を開きます。with
ステートメントを使うことで、画像ファイルを安全に開閉できます。
JPEG形式はRGBモードを必要とするため、img.convert('RGB')
で画像をRGBモードに変換します。その後、rgb_img.save(jpeg_path, 'JPEG')
でJPEG形式として画像を保存します。except
ブロックでは、何らかのエラーが発生した場合にエラーメッセージを表示します。例えば、サポートされていない画像形式やファイルが破損している場合などです。
2-1-6. メイン関数
def main():
source_dir = input("対象となる画像が入っているディレクトリのパスを入力してください: ").strip()
if not os.path.isdir(source_dir):
print("指定されたパスが存在しないか、ディレクトリではありません。プログラムを終了します。")
return
output_dir = os.path.join(source_dir, 'converted_jpeg')
convert_webp_to_jpeg(source_dir, output_dir)
main
関数は、ユーザーから入力を受け付け、変換処理を開始します。input
関数でユーザーに変換元のディレクトリパスを入力させ、os.path.isdir(source_dir)
でディレクトリが存在するかを確認します。存在しない場合やディレクトリではない場合はエラーメッセージを表示してプログラムを終了します。
存在する場合は、converted_jpeg
という新しいフォルダを作成し、convert_webp_to_jpeg
関数を呼び出して画像の変換処理を行います。
2-1-7. エントリーポイント
if __name__ == "__main__":
main()
この部分はPythonのエントリーポイントです。スクリプトが直接実行された場合にのみmain
関数を呼び出します。モジュールとしてインポートされた場合には実行されません。
2-2.全体のソースコード
今回作成した全体のPythonコードは以下の通りです。
import os
from PIL import Image
def convert_webp_to_jpeg(source_dir, output_dir):
# 出力ディレクトリが存在しない場合は作成する
if not os.path.exists(output_dir):
os.makedirs(output_dir)
print(f"出力ディレクトリ '{output_dir}' を作成しました。")
else:
print(f"出力ディレクトリ '{output_dir}' は既に存在します。")
# 指定されたディレクトリ内のファイルをすべて取得
files = os.listdir(source_dir)
webp_files = [file for file in files if file.lower().endswith('.webp')]
if not webp_files:
print("指定されたディレクトリにWebP形式の画像が見つかりませんでした。")
return
for file_name in webp_files:
webp_path = os.path.join(source_dir, file_name)
jpeg_name = os.path.splitext(file_name)[0] + '.jpeg'
jpeg_path = os.path.join(output_dir, jpeg_name)
try:
with Image.open(webp_path) as img:
rgb_img = img.convert('RGB') # JPEGはRGB形式が必要
rgb_img.save(jpeg_path, 'JPEG')
print(f"変換成功: '{file_name}' → '{jpeg_name}'")
except Exception as e:
print(f"変換失敗: '{file_name}' - エラー: {e}")
def main():
print("WebPからJPEGへの変換プログラム")
source_dir = input("対象となる画像が入っているディレクトリのパスを入力してください: ").strip()
# ディレクトリの存在確認
if not os.path.isdir(source_dir):
print("指定されたパスが存在しないか、ディレクトリではありません。プログラムを終了します。")
return
# 出力ディレクトリのパスを設定(例: 'converted_jpeg'という名前のディレクトリを作成)
output_dir = os.path.join(source_dir, 'converted_jpeg')
convert_webp_to_jpeg(source_dir, output_dir)
if __name__ == "__main__":
main()
3. WebP画像をJPEGに一括変換するコードの実行結果
ここからは実際にプログラムを実行する方法とその結果について解説します。
3-1. プログラムの実行方法
このセクションでは、先ほどのPythonプログラムを実行する方法について解説します。プログラムを実行するには、Pythonがインストールされている環境で以下の手順に従ってください。
- コードを保存: まず、前述のサンプルコードをPythonファイルとして保存します。ファイル名は任意ですが、ここでは
convert_webp_to_jpeg.py
とします。 - ターミナルまたはコマンドプロンプトを開く: コードを保存したディレクトリに移動します。例えば、ファイルがデスクトップにある場合は以下のように移動します。bashコードをコピーする
cd ~/Desktop
- プログラムを実行: 以下のコマンドを使用してプログラムを実行します。bashコードをコピーする
python convert_webp_to_jpeg.py
- ディレクトリのパスを入力: プログラムが開始されると、「対象となる画像が入っているディレクトリのパスを入力してください:」というメッセージが表示されます。WebP画像が含まれているディレクトリのパスを入力し、Enterキーを押します。plaintextコードをコピーする
対象となる画像が入っているディレクトリのパスを入力してください: /path/to/webp_images
3-2. プログラムの使い方
プログラムの使い方は非常にシンプルです。指定されたディレクトリ内の全てのWebP画像が自動的にJPEGに変換され、同じディレクトリ内にconverted_jpeg
というフォルダが作成され、その中に変換されたJPEG画像が保存されます。
例えば、以下のような構成のディレクトリを指定したとします。
/path/to/webp_images/
│
├─ image1.webp
├─ image2.webp
└─ image3.webp
プログラムを実行すると、/path/to/webp_images/converted_jpeg/
フォルダが作成され、その中にimage1.jpeg
、image2.jpeg
、image3.jpeg
が保存されます。
3-3. 実行結果の確認
プログラムが正常に動作すると、ターミナルまたはコマンドプロンプトに以下のようなメッセージが表示されます。
出力ディレクトリ '/path/to/webp_images/converted_jpeg' を作成しました。
変換成功: 'image1.webp' → 'image1.jpeg'
変換成功: 'image2.webp' → 'image2.jpeg'
変換成功: 'image3.webp' → 'image3.jpeg'
このメッセージは、WebP画像が正常にJPEG形式に変換され、新しいディレクトリに保存されたことを示しています。変換に成功した画像ファイル名と、その変換後のファイル名が表示されるため、どの画像が変換されたかを確認できます。
以下は私の環境でChatGPTで生成したwebp画像を変換した結果です。このように正常に変換することができました。
WebPからJPEGへの変換プログラム
対象となる画像が入っているディレクトリのパスを入力してください: C:\XXXXXXXXXX\20240917-yolo
出力ディレクトリ 'C:\XXXXXXXXXX\20240917-yolo\converted_jpeg' を作成しました。
変換成功: 'DALL·E 2024-09-17 14.01.50 - A visually striking and futuristic image representing machine learning and object detection with YOLO. The image should include elements like neural n.webp' → 'DALL·E 2024-09-17 14.01.50 - A visually striking and futuristic image representing machine learning and object detection with YOLO. The image should include elements like neural n.jpeg'
変換成功: 'DALL·E 2024-09-17 14.02.34 - A playful and colorful illustration representing machine learning and YOLO object detection. The design should include simplified, cartoon-style repre.webp' → 'DALL·E 2024-09-17 14.02.34 - A playful and colorful illustration representing machine learning and YOLO object detection. The design should include simplified, cartoon-style repre.jpeg'
まとめ
WebPからJPEGへの画像変換は、互換性や用途に応じて必要になることがあります。PythonとPillowを使うことで、効率的かつ簡単に画像変換を行うことができ、複数の画像を一括で処理することも可能です。今回紹介した方法では、Python初心者でも扱いやすいようにサンプルコードを提供し、その実行手順や注意点についても詳しく説明しました。画像変換を自動化することで、作業効率を大幅に向上させることができるため、機械学習プロジェクトやデータセットの準備など、さまざまな場面で役立つでしょう。この記事を通じて、Pythonでの画像処理の第一歩を踏み出し、さらなるスキルアップに繋げていただければ幸いです。