Python

Python3でフォルダ内の画像名を撮影日時(Exif)に書き換えて保存する方法Pillow

Python3でフォルダ内の画像の名前を撮影日時(Exif)に書き換えて新規フォルダに保存するPillow Python
この記事は約12分で読めます。
piyo
piyo
今日の運勢

ExifデータとPillowで画像の名前を撮影日時にする

このスクリプトを実行すると、指定したディレクトリ内の画像ファイルが新しいフォルダにExifの撮影日時でリネームされ、保存されます。

piyo
piyo

データーの整理をするときに便利撮影日時になっていると便利だよね

画像の名前を変えたもの(test1.jpgのように)も、撮影日時のデータで名前が変更されました。

完成をすると、下記のように表示されます。

新しいフォルダが作成され、test1とtest2の画像の名前が

before

renamed-imagesフォルダの中の画像の名前が撮影した日時の名前になる

after

Exifデータとは

Exifデータとは、Exchangeable Image File Format(エクスチェンジャブル・イメージ・ファイル・フォーマット)の略で、デジタルカメラやスマートフォンなどの機器で撮影したデジタル写真に付与される撮影情報や位置情報などのデータのことです。

使用素材

コチラの2種類の画像を一度にリネームしていきます。

ミラーレスカメラで撮った画像

iphoneで撮影した画像

Pythonのバージョン

Python3.12.1のバージョンを使用しています。

Dockを立ち上げる

command+「スペースキー」で検索窓が出てくる>「ターミナル」と記入>

「自分のPC名〜%」の後ろに記入していきます。

(例)gotoaya@AGMacBook-Air ~ % ←ここの後ろに記入

Pillowをインストール

Pillowとは

Pillowは、Pythonの画像処理ライブラリであり、画像の生成、変換、処理、表示などの機能を提供します。Pillowは、Python Imaging Library(PIL)のフォークであり、PILの後継として開発されました。画像処理や画像生成など、様々なタスクに利用できます。

Pillowをインストール方法

インストール済みの方は無しでOKです。

Pillowを入れた記憶のない方はコチラを記入してインストール

pip install Pillow

>Enter

EXIFの日時データを書き出してターミナルに書くコードを記入する

import os
from PIL import Image
from PIL.ExifTags import TAGS

def get_original_datetime(image_path):
    try:
        with Image.open(image_path) as img:
            exif_data = img._getexif()
            if exif_data is not None:
                for tag, value in exif_data.items():
                    tag_name = TAGS.get(tag, tag)
                    if tag_name == 'DateTimeOriginal':
                        return value
    except (AttributeError, KeyError, IndexError):
        pass
    return None

def rename_and_move_images(directory_path):
    # 新しいフォルダを作成
    new_folder_path = os.path.join(directory_path, "renamed_images")
    os.makedirs(new_folder_path, exist_ok=True)

    # ディレクトリ内の画像ファイルを処理
    for filename in os.listdir(directory_path):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
            image_path = os.path.join(directory_path, filename)
            original_datetime = get_original_datetime(image_path)

            if original_datetime is not None:
                try:
                    with Image.open(image_path) as img:
                        new_name = original_datetime.replace(":", "").replace(" ", "_") + ".jpg"
                        new_path = os.path.join(new_folder_path, new_name)
                        img.save(new_path)

                        print(f"Image renamed and moved successfully: {new_path}")
                except Exception as e:
                    print(f"Error while renaming and moving image: {e}")
            else:
                print(f"DateTimeOriginal not found in Exif data for {filename}.")

# ここに画像ファイルが含まれるディレクトリのパスを指定してください
image_directory_path = "/Users/gotoaya/Desktop/test14"

# 画像の名前をExifの撮影日時に変更して新しいフォルダに移動する
rename_and_move_images(image_directory_path)

※ディレクトリのパスは、私の場合「/Users/gotoaya/Desktop/test14」にしています。変更したい画像が含まれるディレクトリのパスをimage_directory_pathに指定してください。

※新しいフォルダはrenamed_imagesという名前で作成され、その中に画像が保存されます。

Pythonの拡張子で保存

Pythonの拡張子(.py)で保存して画像と同じフォルダに入れる。

一つのフォルダに画像と.pyコードを格納

今回は「test8」という名前のフォルダに格納しました

Dockを立ち上げる

command+「スペースキー」で検索窓が出てくる>「ターミナル」と記入>

「自分のPC名〜%」の後ろに記入していきます。

(例)gotoaya@AGMacBook-Air ~ % ←ここの後ろに記入

読み込み場所を指定する

cd␣全部格納した、ディレクトリーを記入

cd ディレクトリーを記入

>Enter

piyo
piyo

cdの後ろに半角スペースを入れないとダメピヨ!

※フォルダーのディレクトリーが分からない時は、フォルダーをターミナルに放り込むと表示されるよ。

「Python ファイル名」を記入して「Enter」

Python␣読み込むファイル名

Python 読み込むファイル名
piyo
piyo

Pythonの後ろに半角スペースを入れないとダメピヨ!

>Enter

完成

新しいフォルダが作成されています。中を確認すると

2022年11月2日17:21分に撮影された写真の日付け、秒までファイル名になって記載されています。

ミラーレスカメラで撮影のものと、スマホで撮影のもの両方変換されました。

画像整理が簡単になりそうです!

コードの詳しい解説

もちろんです。以下はコードの詳細な解説です。

import os
from PIL import Image
from PIL.ExifTags import TAGS
  1. os: ファイルシステムとやり取りするためのモジュール。
  2. ImageTAGSはPillowライブラリからインポートされています。Imageは画像処理のためのクラスを提供し、TAGSはExifタグの名前を解釈するための辞書です。
def get_original_datetime(image_path):
    try:
        with Image.open(image_path) as img:
            exif_data = img._getexif()
            if exif_data is not None:
                for tag, value in exif_data.items():
                    tag_name = TAGS.get(tag, tag)
                    if tag_name == 'DateTimeOriginal':
                        return value
    except (AttributeError, KeyError, IndexError):
        pass
    return None
  1. get_original_datetime: 画像ファイルのExifデータから’DateTimeOriginal’というタグの値(撮影日時)を取得する関数。
  2. Image.open(image_path): 指定された画像ファイルを開きます。
  3. img._getexif(): 画像からExifデータを取得します。
  4. 取得したExifデータから’DateTimeOriginal’タグの値を探し、見つかればその値を返します。
def rename_and_move_images(directory_path):
    new_folder_path = os.path.join(directory_path, "renamed_images")
    os.makedirs(new_folder_path, exist_ok=True)

    for filename in os.listdir(directory_path):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
            image_path = os.path.join(directory_path, filename)
            original_datetime = get_original_datetime(image_path)

            if original_datetime is not None:
                try:
                    with Image.open(image_path) as img:
                        new_name = original_datetime.replace(":", "").replace(" ", "_") + ".jpg"
                        new_path = os.path.join(new_folder_path, new_name)
                        img.save(new_path)

                        print(f"Image renamed and moved successfully: {new_path}")
                except Exception as e:
                    print(f"Error while renaming and moving image: {e}")
            else:
                print(f"DateTimeOriginal not found in Exif data for {filename}.")

# ここに画像ファイルが含まれるディレクトリのパスを指定してください
image_directory_path = "path/to/your/images"

# 画像の名前をExifの撮影日時に変更して新しいフォルダに移動する
rename_and_move_images(image_directory_path)
  1. rename_and_move_images: 指定されたディレクトリ内の画像ファイルを処理し、新しいフォルダにExifの撮影日時でリネームして保存する関数。
  2. os.path.join(directory_path, "renamed_images"): 新しいフォルダのパスを作成します。
  3. os.makedirs(new_folder_path, exist_ok=True): 新しいフォルダを作成します。exist_ok=Trueはすでにフォルダが存在する場合にエラーを発生させないようにします。
  4. os.listdir(directory_path): 指定されたディレクトリ内のファイル名のリストを取得します。
  5. filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')): 拡張子が指定された画像ファイルかどうかを確認します。
  6. os.path.join(directory_path, filename): 画像ファイルのフルパスを取得します。
  7. get_original_datetime(image_path): 画像ファイルからExifの’DateTimeOriginal’を取得します。
  8. with Image.open(image_path) as img:: 画像を開きます。
  9. new_name = original_datetime.replace(":", "").replace(" ", "_") + ".jpg": 撮影日時を整形して新しいファイル名を生成します。
  10. os.path.join(new_folder_path, new_name): 新しいフォルダ内に保存するためのパスを作成します。
  11. img.save(new_path): 画像を新しいパスに保存します。
  12. print(f"Image renamed and moved successfully: {new_path}"): 成功した場合にメッセージを表示します。
  13. except Exception as e:: エラーが発生した場合にエラーメッセージを表示します。
  14. else:: ‘DateTimeOriginal’が見つからなかった場合にメッセージを表示します。

コメント

タイトルとURLをコピーしました