Изменение "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, если оно действительно использует его.