以下の内容はhttps://pydocument.hatenablog.com/entry/2023/12/28/134259より取得しました。


Pythonで画像のデータサイズや画像サイズ(寸法)を確認する方法

画像処理やデータ分析において、画像ファイルのサイズ(容量)や画像サイズ(寸法、画像の幅と高さ)を把握したい場合があります。例えば、大量の画像データを扱う際に、ファイルサイズに基づいて処理を最適化したり、機械学習モデルの入力として適切な画像サイズに調整したりする場合などです。この記事では、Pythonを使用して画像のデータサイズと画像サイズを簡単に確認する方法を紹介します。主に、画像処理ライブラリであるPillow (PIL) と、ファイルシステム操作を行うためのosモジュールを使用します。

環境

この記事で紹介するコードは、以下の環境で動作確認しています。

  • Python 3.8 以上
  • Pillow (PIL) 9.0.0 以上

Pillowがインストールされていない場合は、次のコマンドでインストールできます。

pip install Pillow

手順

1. ライブラリのインポート

まず、必要なライブラリをインポートします。

from PIL import Image
import os
  • PIL (Pillow): PillowのImageモジュールを使って画像を開き、操作するために利用します
  • os: ファイルパスの操作や、ファイルサイズの取得など、OS関連の機能の操作のために利用します

2. 画像の読み込みと情報取得 (基本)

まずは、必要最低限のシンプルなコードで画像の情報を取得します。

from PIL import Image
import os

image_path = "path/to/your/image.jpg"  # 実際の画像のパスに置き換えてください

img = Image.open(image_path)
width, height = img.size
file_size_bytes = os.path.getsize(image_path)
file_size_mb = file_size_bytes / (1024 * 1024)

print(f"ファイルサイズ: {file_size_mb:.2f} MB")
print(f"画像の幅: {width} px")
print(f"画像の高さ: {height} px")

ファイルサイズは os.path.getsize(image_path)で取得します。戻り値の単位はByte(バイト)です。扱いやすいように、file_size_mb = file_size_bytes / (1024 * 1024)の処理でバイト単位のファイルサイズをMB単位に変換します。

Image.open(image_path)で指定したパスの画像をPillowのImageオブジェクトとして開きます。画像サイズ(寸法)はimg.sizeで取得することができます。開いた画像の幅と高さをタプル (width, height) で取得することができます。

3. 応用: 関数化、エラー処理、型ヒント

次に、上記のコードを関数化し、エラー処理と型ヒントを追加して、より再利用しやすいコードにします。

from PIL import Image
import os
from typing import Tuple, Union

def get_image_info(image_path: str) -> Union[Tuple[float, int, int], None]:
    """
    指定されたパスの画像について、情報(ファイルサイズ、幅、高さ)を取得する関数。

    Args:
        image_path (str): 画像ファイルのパス

    Returns:
        Union[Tuple[float, int, int], None]: (ファイルサイズ(MB), 幅, 高さ) のタプル。
            ファイルが存在しない場合、または画像として読み込めない場合はNoneを返す。
    """
    if not os.path.exists(image_path):
        print(f"エラー: 指定されたファイルが見つかりません: {image_path}")
        return None

    try:
        img = Image.open(image_path)
        width, height = img.size
        file_size_bytes = os.path.getsize(image_path)
        file_size_mb = file_size_bytes / (1024 * 1024)
        return file_size_mb, width, height

    except Exception as e:
        print(f"エラー: 画像の読み込み中にエラーが発生しました: {e}")
        return None

get_image_info関数として関数化し、処理をまとめることで、コードの再利用性が向上させます。他にも以下のように、機能を追加していきます。

  • 例外処理 (try...except): Image.open() を実行する前に、os.path.exists()でファイルが実在するかを確認し、ファイルが存在しない場合は、エラーメッセージを表示します。Image.open()や、その他の処理中に発生する可能性のあるエラーをキャッチしします。
  • 型ヒント: 関数の引数(image_path: str)と戻り値(-> Union[Tuple[float, int, int], None])に型ヒントを追加し、コードの可読性と保守性を高めます。 * docstringの改善: 戻り値がNoneになる場合の条件を明記します。

pydocument.hatenablog.com

4. プログラムの実行

定義した関数を使用して、実際に画像の情報を取得してみましょう。

# 関数の使用例
image_path = "path/to/your/image.jpg"  # 実際の画像のパスに置き換えてください

image_info = get_image_info(image_path)

if image_info:
    file_size, width, height = image_info
    print(f"ファイルサイズ: {file_size:.2f} MB")
    print(f"画像の幅: {width} px")
    print(f"画像の高さ: {height} px")

実行結果の例

ファイルサイズ: 2.56 MB
画像の幅: 1920 px
画像の高さ: 1080 px

このようにファイルの情報を取得することができれば完成です。

まとめ

この記事では、PythonのPillowとosモジュールを使って、画像のファイルサイズと寸法(幅と高さ)を取得する方法を、段階的にコードを改善しながら紹介しました。業務で実際に利用する際は、最終的なコードのようにエラー処理や型ヒントも追加し、より安全に利用できるようにすることをおすすめします。

Pythonで学ぶ画像認識 機械学習実践シリーズ [ 田村雅人 ]




以上の内容はhttps://pydocument.hatenablog.com/entry/2023/12/28/134259より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14