- 1. 概要
- 2. 作成
- 3. 参考サイト
1. 概要
いよいよ、ソースを作成します。
2. 作成
下記のソースを作成します。
import os
import tkinter as tk
from tkinter import messagebox
from tkinterdnd2 import DND_FILES, TkinterDnD
from PIL import Image
def remove_metadata(file_path):
try:
# TkinterDnDがパスを {} で囲むことがあるため、それを除去
file_path = file_path.strip("{}")
# 対応する拡張子かチェック
ext = os.path.splitext(file_path)[1].lower()
if ext not in [".jpg", ".jpeg", ".png"]:
return False, f"未対応のファイル形式です: {os.path.basename(file_path)}"
# 画像を開く
with Image.open(file_path) as img:
# 画像データそのものだけをコピー(これによりExifなどのメタデータが消える)
data = list(img.getdata())
clean_img = Image.new(img.mode, img.size)
clean_img.putdata(data)
# 元のファイルに上書き保存
if ext in [".jpg", ".jpeg"]:
clean_img.save(file_path, "JPEG", quality=95)
elif ext == ".png":
clean_img.save(file_path, "PNG", optimize=True)
return True, f"削除成功: {os.path.basename(file_path)}"
except Exception as e:
return False, f"エラー ({os.path.basename(file_path)}): {str(e)}"
def handle_drop(event):
files = window.tk.splitlist(event.data)
success_count = 0
results = []
for f in files:
success, message = remove_metadata(f)
if success:
success_count += 1
results.append(message)
log_text.delete(1.0, tk.END)
log_text.insert(tk.END, "\n".join(results))
messagebox.showinfo("処理完了", f"{len(files)}個中、{success_count}個のファイルの個人情報を削除しました!")
# --- 画面(GUI)の設定 ---
window = TkinterDnD.Tk()
window.title("画像個人情報クリーナー")
window.geometry("500x350")
# ドラッグ&ドロップを促すエリア
drop_label = tk.Label(
window,
text="ここに画像ファイル(.jpg / .png)を\nドラッグ&ドロップしてください",
bg="#e0e0e0",
fg="#333333",
font=("Helvetica", 14, "bold"),
relief="groove",
bd=3,
)
drop_label.pack(fill=tk.BOTH, expand=True, padx=20, pady=(20, 10))
# ログ表示エリア
log_text = tk.Text(window, height=6, bg="#f5f5f5", font=("Consolas", 10))
log_text.pack(fill=tk.X, padx=20, pady=(0, 20))
log_text.insert(tk.END, "ここに処理結果が表示されます。")
# ドラッグ&ドロップ機能をラベルにバインド
drop_label.drop_target_register(DND_FILES)
drop_label.dnd_bind("<<Drop>>", handle_drop)
window.mainloop()
3. 参考サイト
本ページは、「Gemini」伍長を参考にさせていただきました。
まだ、解析できていない。
|