Python - 個人情報削除 - 作成


 クラウディア


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」伍長を参考にさせていただきました。  まだ、解析できていない。

audiobook.jp
AbemaTV 無料体験
EaseUS
【usus ウズウズ】
ベルリッツ
それがだいじWi-Fi
薬屋の独り言
earthcar(アースカー)
TikTok Shop 【リピート用プログラム】
損保との違い
U-NEXT
5G CONNECT
健康サポート特集
ネットオークションの相場、統計、価格比較といえばオークファン
サウンドハウス
ハイスピードプラン
JETBOY
Amazonギフトカード
EMEET 1
葬送のフリーレン Prime Video
アフィリエイトのアクセストレード