2015-08-18 18 views
9

Sono appena tornato da un viaggio negli Stati Uniti, e dopo la modifica di tutte le immagini, ho notato che la fotocamera utilizzata il fuso orario di Israele, e non l'americano. C'è una differenza di tempo di 7 ore, quindi è un grosso problema per me. Ho 175 GB di foto, ma mi interessa "solo" circa 350 foto. Non posso modificare manualmente i loro EXIF, quindi ho pensato di usare C#.Modifica "DateTaken" di una foto

L'idea è che leggerà EXIF ​​di ciascuna foto, ottenere il tempo, e impostare il tempo di meno di 7 ore nella foto originale. Ho provato ad usare la classe Image, ma non funziona. Ho provato a utilizzare il bitmapMetadate e ha funzionato! Sono riuscito a ottenere il tempo e fare meno sette ore, ma non ho idea di come salvarlo. Come posso farlo? Grazie!

public static string PhotoToBeEdited(FileInfo f) 
    { 
     FileStream fs = new FileStream(f.FullName, FileMode.Open, FileAccess.Read, FileShare.Read); 
     BitmapSource img = BitmapFrame.Create(fs); 
     BitmapMetadata md = (BitmapMetadata)img.Metadata; 
     string date = md.DateTaken; 
     Console.WriteLine(date); 
     DateTime dt= DateTime.Parse(date); 
     date = dt.AddHours(-7).ToString(); 

     [...] 

     return date; 
    } 

risposta

8

Il modo più semplice che ho trovato sta utilizzando la tecnica descritta here e System.Drawing.Bitmap;

Il codice dovrebbe essere simile a questo:

public void ChangeDateTaken(string path) 
    { 
     Image theImage = new Bitmap(path); 
     PropertyItem[] propItems = theImage.PropertyItems; 
     Encoding _Encoding = Encoding.UTF8; 
     var DataTakenProperty1 = propItems.Where(a => a.Id.ToString("x") == "9004").FirstOrDefault(); 
     var DataTakenProperty2 = propItems.Where(a => a.Id.ToString("x") == "9003").FirstOrDefault(); 
     string originalDateString = _Encoding.GetString(DataTakenProperty1.Value); 
     originalDateString = originalDateString.Remove(originalDateString.Length - 1); 
     DateTime originalDate = DateTime.ParseExact(originalDateString, "yyyy:MM:dd HH:mm:ss", null); 

     originalDate = originalDate.AddHours(-7); 


     DataTakenProperty1.Value = _Encoding.GetBytes(originalDate.ToString("yyyy:MM:dd HH:mm:ss") + '\0'); 
     DataTakenProperty2.Value = _Encoding.GetBytes(originalDate.ToString("yyyy:MM:dd HH:mm:ss") + '\0'); 
     theImage.SetPropertyItem(DataTakenProperty1); 
     theImage.SetPropertyItem(DataTakenProperty2); 
     string new_path = System.IO.Path.GetDirectoryName(path) + "\\_" + System.IO.Path.GetFileName(path); 
     theImage.Save(new_path); 
     theImage.Dispose(); 
    } 

Non dimenticate di aggiungere il montaggio System.Drawing. Inoltre è probabilmente necessario regolare formato DateTime alla vostra cultura, se necessario

+0

Grazie! Sei un genio! – GINCHER

1

Non esattamente una soluzione di programmazione, ma è possibile utilizzare exiftool. Lo uso per questo scopo esatto.

Data/Time Shift Caratteristica

Avete mai dimenticato di impostare la data/ora sulla fotocamera digitale prima di prendere un sacco di foto? ExifTool ha una funzione differita che lo rende facile da applicare una correzione batch per i timestamp delle immagini (ad es. Cambiare la "Data creazione immagine", ha riferito da Windows Explorer). Dire per esempio che l'orologio della fotocamera è stato azzerato a 2000: 01: 01 00:00:00 quando si mette in una nuova batteria al 2005: 11: 03 10:48:00. Quindi tutte le immagini che hai scattato in seguito hanno timestamp errati di 5 anni, 10 mesi, 2 giorni, 10 ore e 48 minuti. Per risolvere questo problema, mettere tutte le immagini nella stessa directory ("DIR") ed eseguire exiftool:

> exiftool "-DateTimeOriginal+=5:10:2 10:48:0" DIR 

È possibile anche impostare il campo TimeZoneOffset, nel caso ci sia mai un software che in realtà lo usa.

+1

ho provato e ho rinunciato. Non ho idea di come usarlo. Grazie comunque. A proposito, hai un nome fantastico! – GINCHER