2015-08-18 11 views
9

Właśnie wróciłem z podróży do Stanów Zjednoczonych, a po edycji wszystkich zdjęć zauważyłem, że kamera korzystała z izraelskiej strefy czasowej, a nie z amerykańskiego. Jest różnica czasu 7 godzin, więc to dla mnie duży problem. Mam 175 GB zdjęć, ale "tylko" obchodzi mnie około 350 zdjęć. Nie mogę edytować ich EXIF ​​ręcznie, więc pomyślałem o użyciu C#.Zmiana "DateTaken" zdjęcia

Chodzi o to, aby przeczytać EXIF ​​każdego zdjęcia, uzyskać czas i ustawić czas minus 7 godzin na oryginalnym zdjęciu. Próbowałem użyć klasy Image, ale to nie działa. Próbowałem użyć bitmapMetadate i działało! Udało mi się zdobyć czas i zrobić minus siedem godzin, ale nie mam pojęcia, jak to zapisać. Jak mogę to zrobić? Dzięki!

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

Odpowiedz

8

Najprostszym sposobem, jaki znalazłem, jest użycie opisu technicznego opisanego jako here i System.Drawing.Bitmap;

Kod powinien wyglądać następująco:

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

Nie zapomnij dodać zespół System.Drawing. Prawdopodobnie będziesz musiał dostosować format DateTime do swojej kultury, w razie potrzeby

+0

Dzięki! Jesteś geniuszem! – GINCHER

1

Niezupełnie rozwiązanie programistyczne, ale można użyć exiftool. Używam go do tego celu.

Date/Time Funkcja przesuwania

Czy kiedykolwiek zapomniał ustawić datę/godzinę w aparacie cyfrowym przed sobą kilka zdjęć? ExifTool posiada funkcję przesunięcia czasowego , która ułatwia zastosowanie poprawki partii do znaczników czasowych obrazów (np. Zmień "Zdjęcie zrobione Data" zgłoszone przez Eksploratora Windows ). Załóżmy na przykład, że zegar aparatu został zresetowany do 2000: 01: 01 00:00:00 po włożeniu nowej baterii na rok 2005: 11: 03 10:48:00. Następnie wszystkie zdjęcia wykonane później mają znaczniki czasu, które są nieprawidłowe przez 5 lat, 10 miesięcy, 2 dni, 10 godzin i 48 minut. Aby rozwiązać ten problem, umieścić wszystkich zdjęć w tym samym katalogu („dir”) i uruchomić exiftool:

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

Można również ustawić pole TimeZoneOffset, w przypadku nie zawsze oprogramowanie, które faktycznie go używa.

+1

Próbowałem go i poddałem się. Nie mam pojęcia, jak z niego korzystać. Dzięki i tak. BTW, masz świetne imię! – GINCHER