フォルダ内の写真を何のカメラで撮ったかを調査するPython

  • URLをコピーしました!

ChatGPTで作ってもらったプログラムを投下するだけの記事。

ChatGPTで色々なプログラムを作ってもらっているが、いい感じに生成できたものを今後もポストしていきたい。

目次

プログラムの内容

特定のフォルダを選択し、その中にある画像ファイルを何のカメラで撮影したかを集計するプログラム。

ソースコード

import os
import tkinter as tk
from tkinter import filedialog, ttk
import tkinter.scrolledtext as scrolledtext
from PIL import Image
from collections import Counter
from concurrent.futures import ThreadPoolExecutor
import threading

def get_device_info(image_path):
    try:
        with Image.open(image_path) as img:
            exif_data = img.getexif()  # 使用するメソッドを getexif() に変更
            if exif_data:
                make = exif_data.get(271, 'Unknown Make')
                model = exif_data.get(272, 'Unknown Model')
                return f"{make} {model}"
    except IOError:
        return "Error reading file"
    return "No EXIF data"


def process_file(file_path):
    if file_path.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif')):
        return get_device_info(file_path)
    return None

def process_images(folder_path, total_files, update_progress, complete_callback):
    device_count = Counter()
    with ThreadPoolExecutor(max_workers=10) as executor:
        futures = [executor.submit(process_file, os.path.join(folder_path, file_name)) for file_name in os.listdir(folder_path)]
        for i, future in enumerate(futures):
            device_info = future.result()
            if device_info:
                device_count[device_info] += 1
            update_progress(i + 1, total_files)
    complete_callback(device_count)

def update_progress_bar(processed_files, total_files):
    progress_var.set((processed_files / total_files) * 100)
    progress_label.config(text=f"Processed {processed_files} of {total_files} files")

def show_results(device_usage):
    result_text.delete('1.0', tk.END)
    for device, count in device_usage.most_common():  # most_commonを使用して頻度の高い順に取得
        result_text.insert(tk.END, f"{device}: {count} times\n")

def select_folder():
    folder_path = filedialog.askdirectory()
    if folder_path:
        file_paths = [os.path.join(folder_path, name) for name in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, name))]
        total_files = len(file_paths)
        progress_var.set(0)
        progress_label.config(text="Processed 0 of 0 files")
        threading.Thread(target=process_images, args=(folder_path, total_files, update_progress_bar, show_results)).start()

# Set up the GUI
root = tk.Tk()
root.title("Photo EXIF Analyzer")

select_button = tk.Button(root, text="Select Folder", command=select_folder)
select_button.pack(pady=10)

progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate", variable=progress_var)
progress_bar.pack(pady=10)

progress_label = tk.Label(root, text="Processed 0 of 0 files")
progress_label.pack(pady=5)

result_text = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=40, height=10)
result_text.pack(padx=10, pady=10)

root.mainloop()

使い方

ソースコードを.pyで保存し、コマンドプロンプトから起動。

GUIでフォルダを選択するダイアログが表示される為、フォルダを選択すると処理が始まる。

雑記

自分は過去に撮影したファイルを一つのフォルダに保存し、クラウドに共有するという管理方法を取っている。

そんな時、ふとどのカメラで撮影した回数が多いのかな?と気になって作成。

ファイルの情報はexifに依存するので、exifが無いとうまく動作しない。

また、私のファイルもおかしいものがあるようで、「RICOH IMAGING COMPANY, LTD.Apple iPhone 13」とか分けわからない結果を出力してしまっている。

created by Rinker
¥3,234 (2024/04/28 03:33:04時点 Amazon調べ-詳細)
created by Rinker
¥770 (2024/04/28 07:33:26時点 Amazon調べ-詳細)
よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

どうもZuxikkuです。
日本語だとズィックだとかジックって呼ばれています。
外国の方だとズクシーとか。ガジェットとか新しいもの大好き。

コメント

コメントする

CAPTCHA


目次