-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbulk_exif_editor.py
136 lines (108 loc) · 5.37 KB
/
bulk_exif_editor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image
from PIL.ExifTags import TAGS
import piexif
import os
from tkcalendar import DateEntry
import time
# Funzione per ottenere la data di scatto originale dai dati EXIF
def get_data_exif(file_path):
try:
img = Image.open(file_path)
exif_data = img._getexif()
# Trova il tag corrispondente a "DateTimeOriginal"
date_time_original_tag = None
for tag, value in TAGS.items():
if value == 'DateTimeOriginal':
date_time_original_tag = tag
break
if exif_data and date_time_original_tag:
return exif_data.get(date_time_original_tag)
else:
return "N/A"
except Exception as e:
return f"Errore: {str(e)}"
# Funzione per modificare la data di scatto EXIF
def cambia_data_exif(file_path, nuova_data):
try:
img = Image.open(file_path)
# Carica i dati EXIF esistenti o crea un nuovo dizionario se non esistono
if 'exif' in img.info:
exif_dict = piexif.load(img.info['exif'])
else:
exif_dict = {"0th": {}, "Exif": {}, "GPS": {}, "Interop": {}, "1st": {}, "thumbnail": None}
# Aggiungi o modifica la data di scatto nel tag 36867 (DateTimeOriginal)
exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal] = nuova_data.encode('utf-8')
# Anche per il tag 36868 (DateTimeDigitized) e 306 (DateTime) per coerenza
exif_dict['Exif'][piexif.ExifIFD.DateTimeDigitized] = nuova_data.encode('utf-8')
exif_dict['0th'][piexif.ImageIFD.DateTime] = nuova_data.encode('utf-8')
exif_bytes = piexif.dump(exif_dict)
img.save(file_path, exif=exif_bytes)
# Converti la data in formato timestamp
nuova_data_formattata = time.strptime(nuova_data, "%Y:%m:%d %H:%M:%S")
nuova_data_timestamp = time.mktime(nuova_data_formattata)
# Modifica i timestamp del file
os.utime(file_path, (nuova_data_timestamp, nuova_data_timestamp))
return True # Indica che l'operazione è stata eseguita correttamente
except Exception as e:
return False # Indica che c'è stato un errore
# Funzione per selezionare i file
def seleziona_file():
file_paths = filedialog.askopenfilenames(filetypes=[("Immagini", "*.jpg *.jpeg *.png")])
if file_paths:
listbox_files.delete(0, tk.END) # Svuota la lista precedente
for file_path in file_paths:
data_exif = get_data_exif(file_path)
listbox_files.insert(tk.END, f"{os.path.basename(file_path)} - Data di scatto: {data_exif}")
root.file_paths = file_paths
# Funzione per modificare la data di scatto per tutti i file selezionati
def modifica_data():
if hasattr(root, 'file_paths') and root.file_paths:
# Costruisce la data completa
nuova_data = f"{calendario.get_date().strftime('%Y:%m:%d')} {entry_ora.get()}"
if nuova_data:
success = True
for file_path in root.file_paths:
if not cambia_data_exif(file_path, nuova_data):
success = False
break # Se un file fallisce, interrompiamo il ciclo
# Mostra un unico messaggio alla fine
if success:
messagebox.showinfo("Successo", "La data di scatto è stata modificata con successo per tutti i file selezionati!")
# Aggiorna la Listbox con le nuove date EXIF
listbox_files.delete(0, tk.END) # Svuota la lista precedente
for file_path in root.file_paths:
data_exif = get_data_exif(file_path)
listbox_files.insert(tk.END, f"{os.path.basename(file_path)} - Data di scatto: {data_exif}")
else:
messagebox.showerror("Errore", "Si è verificato un errore durante la modifica di uno o più file.")
else:
messagebox.showwarning("Avviso", "Inserisci una nuova data prima di continuare.")
else:
messagebox.showwarning("Avviso", "Seleziona prima uno o più file.")
# Creazione della GUI
root = tk.Tk()
root.title("Modifica EXIF - Data di Scatto")
# Bottone per selezionare file
button_seleziona = tk.Button(root, text="Seleziona File", command=seleziona_file)
button_seleziona.pack(padx=10, pady=10)
# Lista per mostrare i file selezionati e le loro date
listbox_files = tk.Listbox(root, width=80, height=10)
listbox_files.pack(padx=10, pady=10)
# Label e DateEntry per selezionare la nuova data
label_data = tk.Label(root, text="Seleziona la nuova data:")
label_data.pack(padx=10, pady=5)
calendario = DateEntry(root, date_pattern='yyyy/mm/dd')
calendario.pack(padx=10, pady=5)
# Label e Entry per inserire la nuova ora
label_ora = tk.Label(root, text="Inserisci la nuova ora (HH:MM:SS):")
label_ora.pack(padx=10, pady=5)
entry_ora = tk.Entry(root, width=10)
entry_ora.insert(0, time.strftime('%H:%M:%S')) # Inserisce l'ora corrente come valore predefinito
entry_ora.pack(padx=10, pady=5)
# Bottone per modificare la data
button_modifica = tk.Button(root, text="Modifica Data di Scatto", command=modifica_data)
button_modifica.pack(padx=10, pady=10)
# Avvio del loop della GUI
root.mainloop()