C # Установить / создать параметр DateTaken - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь установить параметр DateTaken с помощью C #, потому что у меня есть много фотографий без этой даты. Я нашел только этот комментарий change-datetaken-of-a-photo В этом топике они меняют его и не создают.

Если использовать эту функцию, но DataTakenProperty1 или DataTakenProperty2 имеет значение null ине может быть установлен.

    private static void SetDateTaken(string path, DateTime NEWdate)
    {
        Image theImage = new Bitmap(path);
        PropertyItem[] propItems = theImage.PropertyItems;
        Encoding _Encoding = Encoding.UTF8;

        var DataTakenPropert = propItems.SetValue(NEWdate.ToString("yyyy:MM:dd HH:mm:ss"), ??How do i know the index??);

        theImage.SetPropertyItem(DataTakenProperty);
        string new_path = Path.GetDirectoryName(path) + "\\_" + Path.GetFileName(path);
        theImage.Save(new_path);
        theImage.Dispose();
    }

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 18 октября 2019

Вы можете добиться этого, используя небольшую хитрость, так как вы не можете инициировать PropertyItem , когда он равен нулю.

Сложно установить элементы свойств, потому что класс PropertyItemне имеет публичных конструкторов. Одним из способов обойти это ограничение является получение PropertyItem путем получения значения свойства PropertyItems или вызова метода GetPropertyItem для изображения, которое уже имеет элементы свойства. Затем вы можете установить поля PropertyItem и передать его SetPropertyItem.

private static void SetDateTaken(string path, string samplePath, DateTime NEWdate)
{         
    Encoding _Encoding = Encoding.UTF8;
    Image theImage = new Bitmap(path);
    PropertyItem[] propItems = theImage.PropertyItems;

    var DataTakenProperty1 = propItems.FirstOrDefault(a => a.Id.ToString("x") == "9003");
    var DataTakenProperty2 = propItems.FirstOrDefault(a => a.Id.ToString("x") == "9004");

    //// this is where you do the hack
    if (DataTakenProperty1 == null)
    {
        Image sampleImage = new Bitmap(samplePath);
        PropertyItem fakePropertyItem1 = sampleImage.PropertyItems.FirstOrDefault(a => a.Id.ToString("x") == "9003");
        fakePropertyItem1.Value = _Encoding.GetBytes(NEWdate.ToString("yyyy:MM:dd HH:mm:ss") + '\0');
        fakePropertyItem1.Len = fakePropertyItem1.Value.Length;
        theImage.SetPropertyItem(fakePropertyItem1);

        PropertyItem fakePropertyItem2 = sampleImage.PropertyItems.FirstOrDefault(a => a.Id.ToString("x") == "9004");
        fakePropertyItem2.Value = _Encoding.GetBytes(NEWdate.ToString("yyyy:MM:dd HH:mm:ss") + '\0');
        fakePropertyItem2.Len = fakePropertyItem2.Value.Length;
        theImage.SetPropertyItem(fakePropertyItem2);
    }
    else
    {
        DataTakenProperty1.Value = _Encoding.GetBytes(NEWdate.ToString("yyyy:MM:dd HH:mm:ss") + '\0');
        DataTakenProperty2.Value = _Encoding.GetBytes(NEWdate.ToString("yyyy:MM:dd HH:mm:ss") + '\0');
        theImage.SetPropertyItem(DataTakenProperty1);
        theImage.SetPropertyItem(DataTakenProperty2);
    }

    theImage.Save(newPath);
    theImage.Dispose();
}

Список PropertyIds

...