PythonとPillowで画像処理を自動化:PNGからJPEGへの一括変換とリサイズ

※本ページはアフィリエイト広告を利用しています

画像処理はデジタルメディアやウェブ開発、データ解析など、多くの分野で必要とされるスキルです。

特に、複数の画像ファイルを効率よく処理する必要がある場合、プログラミングを用いて自動化することが有用です。

この記事では、PythonのPillowライブラリを使用して、指定されたディレクトリ内のPNGファイルをJPEGに変換し、リサイズするプログラムの作成方法を詳しく解説します。

この記事でわかること
  • 画像のリサイズ、ファイル形式変換の流れ
  • 画像処理ライブラリPillowのインストール方法
  • リサイズ、ファイル形式変換を実装するためのソースコード
目次

Pillowとは

Pillowは、Python Imaging Library(PIL)のフォークであり、Pythonで画像処理を行うためのライブラリです。PILが長らくメンテナンスされていなかったため、その代わりとして広く使われています。

Pillowは多くの画像フォーマット(PNG、JPEG、BMP、GIF、TIFFなど)に対応しており、画像の読み込み、編集、保存が容易に行えます。

主な機能としては、画像のリサイズ、クロッピング(切り取り)、回転、色調整、フィルタリングなどがあります。また、テキストの挿入や、複数の画像を一つに合成するような高度な操作もサポートしています。

Pillowは、Webアプリケーション、データ解析、人工知能、画像認識など、多様な用途で使用されています。簡単なAPIと豊富なドキュメントがあり、初心者からプロフェッショナルまで幅広いユーザーに対応しています。

ライブラリのインストール

コマンドラインで以下のコマンドを実行してください。

pip install Pillow

作成したPythonコード

このPythonプログラムは、指定されたディレクトリ内の全てのPNGファイルをJPEG形式に変換し、リサイズする作業を自動化します。

初めに、ユーザーにPNGファイルが格納されているディレクトリのパスを入力させます。

次に、そのディレクトリ内でPNGファイルを検索し、新たにconverted_jpegという名前の出力ディレクトリを作成します。

各PNGファイルに対して、縦長であれば90度回転させた後、縦横比を維持しながらX軸を1200ピクセルにリサイズします。最後に、リサイズした画像をJPEG形式で出力ディレクトリに保存します。

このプログラムにより、複数のPNGファイルを効率よくJPEGに変換し、リサイズする作業が簡単に行えます。

コード解説

PNG→JPEG変換、リサイズの場合

PNGファイルを読み込み、リサイズ、JPEGファイルへの変換処理を実装するコードについては以下の通りです。

  1. 関数定義: resize_and_convert_png_to_jpeg(input_directory)という関数を定義します。
    • 引数: input_directory(PNGファイルが保存されているディレクトリのパス)
  2. PNGファイルの検索: 指定されたディレクトリ内のすべてのPNGファイルを検索し、そのファイルパスをリストに格納します。
  3. 出力ディレクトリの作成: converted_jpegという名前の出力ディレクトリを作成します(既に存在しない場合)。
  4. PNGファイルの処理: 各PNGファイルに対して以下の処理を行います。
    1. 画像の読み込み: Pillowを使用してPNGファイルを開きます。
    2. 縦長判定と回転: 画像が縦長(Y軸がX軸より長い)であれば、90度回転させます。
    3. リサイズ: 画像の縦横比を維持しながら、X軸を1200ピクセルにリサイズします。
    4. JPEGで保存: リサイズした画像をJPEG形式でconverted_jpegディレクトリに保存します。
  5. ユーザー入力: プログラム実行時に、PNGファイルが保存されているディレクトリのパスをユーザーに入力させます。
  6. ディレクトリの存在確認: ユーザーが入力したディレクトリが存在するかどうかを確認します。
  7. 関数の呼び出し: 上記の処理を行う関数を呼び出し、PNGからJPEGへの変換とリサイズを実行します。

作成した全体のソースコードは以下の通りです。

from PIL import Image
import os
import glob

def resize_and_convert_png_to_jpeg(input_directory):
    # 指定されたディレクトリ内のすべてのPNGファイルを取得
    png_files = glob.glob(f"{input_directory}/*.png")
    
    # PNGファイルが存在しない場合は終了
    if not png_files:
        print("PNGファイルが見つかりませんでした。")
        return
    
    # 出力ディレクトリを作成(存在しない場合)
    output_directory = os.path.join(input_directory, "converted_jpeg")
    os.makedirs(output_directory, exist_ok=True)
    
    for png_file in png_files:
        # 画像を開く
        img = Image.open(png_file)
        
        # 画像が縦長の場合、90度回転
        if img.height > img.width:
            img = img.rotate(90, expand=True)
        
        # 縦横比を維持しながらリサイズ
        aspect_ratio = img.height / img.width
        new_height = int(1200 * aspect_ratio)
        img_resized = img.resize((1200, new_height))
        
        # JPEG形式で保存
        output_file_name = os.path.basename(png_file).replace(".png", ".jpg")
        output_file_path = os.path.join(output_directory, output_file_name)
        img_resized.save(output_file_path, "JPEG")
        
        print(f"{png_file} を {output_file_path} に変換しました。")

if __name__ == "__main__":
    # ユーザーにディレクトリを入力させる
    input_directory = input("PNGファイルが保存されているディレクトリを入力してください:")
    
    # ディレクトリが存在するか確認
    if not os.path.exists(input_directory):
        print("指定されたディレクトリが存在しません。")
    else:
        resize_and_convert_png_to_jpeg(input_directory)

JPEGのリサイズのみの場合

JPEGファイルを読み込み、リサイズ、のみを行うコードについては以下の通りです。

from PIL import Image
import os
import glob

def resize_jpeg_images(input_directory):
    # 指定されたディレクトリ内のすべてのJPEGファイルを取得
    jpeg_files = glob.glob(f"{input_directory}/*.jpg") + glob.glob(f"{input_directory}/*.jpeg")
    
    # JPEGファイルが存在しない場合は終了
    if not jpeg_files:
        print("JPEGファイルが見つかりませんでした。")
        return
    
    # 出力ディレクトリを作成(存在しない場合)
    output_directory = os.path.join(input_directory, "resized_jpeg")
    os.makedirs(output_directory, exist_ok=True)
    
    for jpeg_file in jpeg_files:
        # 画像を開く
        img = Image.open(jpeg_file)
        
        # 縦横比を維持しながらリサイズ
        aspect_ratio = img.height / img.width
        new_height = int(1200 * aspect_ratio)
        img_resized = img.resize((1200, new_height))
        
        # JPEG形式で保存
        output_file_name = os.path.basename(jpeg_file)
        output_file_path = os.path.join(output_directory, output_file_name)
        img_resized.save(output_file_path, "JPEG")
        
        print(f"{jpeg_file} を {output_file_path} にリサイズしました。")

if __name__ == "__main__":
    # ユーザーにディレクトリを入力させる
    input_directory = input("JPEGファイルが保存されているディレクトリを入力してください:")
    
    # ディレクトリが存在するか確認
    if not os.path.exists(input_directory):
        print("指定されたディレクトリが存在しません。")
    else:
        resize_jpeg_images(input_directory)

実行結果

先ほどのコードを実行すると、以下のように指定したディレクトリ内で処理されたファイルのログが出力され、ファイルがリサイズ、JPEG変換されたことが確認できました。

まとめ

この記事では、PythonのPillowライブラリを用いて、複数のPNGファイルをJPEGに変換し、リサイズするプログラムを作成する方法を学びました。

Pillowライブラリは、多機能かつ使いやすい画像処理ライブラリであり、様々な画像処理タスクを効率よく自動化することができます。

それでは、また次の記事でお会いしましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次