Изменение "DateTaken" фотографии
Я только что вернулся из поездки в США, и после редактирования всех фотографий я заметил, что камера использовала израильский часовой пояс, а не американец. Существует разница в 7 часов, поэтому для меня это большая проблема. У меня 175 ГБ фотографий, но мне все равно "всего" около 350 фотографий. Я не могу редактировать их EXIF вручную, поэтому я подумал об использовании С#.
Идея состоит в том, что он будет читать каждую фотографию EXIF, получить время и установить время минус 7 часов на исходной фотографии. Я попытался использовать класс Image, но он не работает. Я попытался использовать bitmapMetadate, и это сработало! Мне удалось получить время и сделать минус семь часов, но я понятия не имею, как его сохранить. Как мне это сделать? Спасибо!
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;
}
Ответы
Ответ 1
Самый простой способ, который я нашел, - использовать технику, описанную здесь здесь и System.Drawing.Bitmap;
Код должен выглядеть следующим образом:
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();
}
Не забудьте добавить сборку System.Drawing.
Также вам, вероятно, потребуется настроить формат DateTime в вашу культуру, если необходимо
Ответ 2
Не совсем программное решение, но вы можете использовать exiftool. Я использую его для этой цели.
Функция изменения даты и времени
Вы когда-нибудь забыли установить дату/время на своей цифровой камере прежде чем брать кучу картин? ExifTool имеет функцию сдвига во времени что позволяет легко применять исправление партии к отметкам времени изображения (например, изменить "Дата снимка", сообщенную Windows Explorer). Скажем, например, что ваши часы камеры были reset до 2000: 01: 01 00:00:00, когда вы положили новую батарею в 2005 году: 11: 03 10:48:00. Затем все фотографии, которые вы временные метки, которые являются неправильными на 5 лет, 10 месяцев, 2 дня, 10 часов и 48 минут. Чтобы исправить это, поместите все изображения в один и тот же каталог ( "DIR" ) и запустите exiftool:
> exiftool "-DateTimeOriginal+=5:10:2 10:48:0" DIR
Вы также можете установить поле TimeZoneOffset, если оно действительно использует его.