2015-08-18 13 views
9

Ich kam gerade von einer Reise in die USA zurück, und nachdem ich alle Fotos bearbeitet hatte, bemerkte ich, dass die Kamera die israelische Zeitzone benutzte und nicht die amerikanische. Es gibt einen Zeitunterschied von 7 Stunden, also ist es ein großes Problem für mich. Ich habe 175GB Fotos, aber mir sind "nur" ungefähr 350 Fotos wichtig. Ich kann ihren EXIF ​​nicht manuell bearbeiten, also habe ich über C# nachgedacht."DateTaken" eines Fotos ändern

Die Idee ist, dass es jedes Foto EXIF ​​zu lesen, die Zeit bekommen, und die Zeit minus 7 Stunden im Originalfoto gesetzt. Ich habe versucht, die Image-Klasse zu verwenden, aber es funktioniert nicht. Ich habe versucht, das BitmapMetadate zu verwenden, und es hat funktioniert! Ich habe es geschafft, die Zeit zu bekommen und minus sieben Stunden zu machen, aber ich habe keine Ahnung, wie ich es speichern kann. Wie kann ich es tun? Vielen Dank!

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; 
    } 

Antwort

8

Der einfachste Weg, die ich gefunden habe ist mit Technik here und System.Drawing.Bitmap beschrieben;

Der Code sollte wie folgt sein:

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(); 
    } 

nicht Vergessen System.Drawing Montage hinzuzufügen. Auch müssen Sie wahrscheinlich Datums- und Uhrzeitformat, um Ihre Kultur anzupassen, wenn nötig

+0

Danke! Du bist ein Genie! – GINCHER

1

Nicht gerade eine Programmierlösung, aber Sie können exiftool verwenden. Ich benutze es für genau diesen Zweck.

Datum/Timeshift-Funktion

Haben Sie schon einmal das Datum/Zeit auf Ihrer Digitalkamera vor der Einnahme von ein paar Bilder zu setzen vergessen? ExifTool hat eine Timeshift-Funktion , die es einfach anzuwenden, um ein Batch-Update auf die Zeitstempel der Bilder (z. B. Änderung der „Bilderstellungsdatum“ berichtet, die von Windows Explorer) macht. Sagen Sie zum Beispiel, dass die Uhr Ihrer Kamera auf 2000: 01: 01 00:00:00 zurückgesetzt wurde, als Sie 2005 eine neue Batterie einlegten: 11: 03 10:48:00. Dann haben alle folgenden Bilder Zeitstempel, die um 5 Jahre, 10 Monate, 2 Tage, 10 Stunden und 48 Minuten falsch sind. Um dies zu beheben, setzen Sie alle Bilder im selben Verzeichnis („DIR“) und läuft exiftool:

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

Sie auch das TimeZoneOffset Feld gesetzt, falls es jemals Software, die es tatsächlich nutzt.

+1

ich es versucht, und ich gab auf. Ich habe keine Ahnung, wie man es benutzt. Danke trotzdem. Übrigens, du hast einen tollen Namen! – GINCHER