Как получить данные EXIF ​​из файла с помощью С#

Я хотел бы написать небольшую программу на С#, которая проходит через мои jpeg-фотографии и, например, сортирует их в датированные папки (используя MY dating conventions, dammit...).

Кто-нибудь знает относительно простой способ получить данные EXIF, такие как дата и время или экспозиция, программно? Спасибо!

Ответ 1

Проверьте этот экстрактор метаданных. Он написан на Java, но также был портирован на С#. Я использовал версию Java для написания небольшой утилиты для переименования моих файлов jpeg на основе тегов даты и модели. Очень прост в использовании.


EDIT экстрактор метаданных также поддерживает .NET. Это очень быстрая и простая библиотека для доступа к метаданным из изображений и видео.

Он полностью поддерживает Exif, а также IPTC, XMP и многие другие типы метаданных из типов файлов, включая JPEG, PNG, GIF, PNG, ICO, WebP, PSD,...

var directories = ImageMetadataReader.ReadMetadata(imagePath);

// print out all metadata
foreach (var directory in directories)
foreach (var tag in directory.Tags)
    Console.WriteLine($"{directory.Name} - {tag.Name} = {tag.Description}");

// access the date time
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault();
var dateTime = subIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTime);

Он доступен через NuGet и код на GitHub.

Ответ 2

Как и предполагалось, вы можете использовать какую-нибудь стороннюю библиотеку или сделать это вручную (что не так уж много работы), но самый простой и гибкий способ - использовать встроенную функциональность в .NET. Подробнее см.:

Я говорю "самое гибкое", потому что .NET не пытается каким-либо образом интерпретировать или объединять данные. Для каждого EXIF вы в основном получаете массив байтов. Это может быть хорошо или плохо в зависимости от того, какой уровень контроля вы действительно хотите.

Кроме того, я должен отметить, что список свойств фактически не соответствует значениям EXIF. Сам EXIF хранится в нескольких таблицах с перекрывающимися идентификаторами, но .NET помещает все в один список и переопределяет идентификаторы некоторых элементов. Но до тех пор, пока вам не нужны точные идентификаторы EXIF, все будет в порядке с сопоставлением .NET.


Изменить: Это можно сделать без загрузки полного изображения после этого ответа: fooobar.com/questions/241485/...

Ответ 4

Вы можете использовать TagLib #, который используется приложениями, такими как F-Spot. Помимо Exif, он будет читать большое количество форматов метаданных для изображений, аудио и видео.

Мне также нравится API ExifUtils, но он не работает и не активно развивается.

Ответ 5

Класс изображения обладает свойствами PropertyItems и PropertyIdList. Вы можете использовать их.

Ответ 6

Получение EXIF-данных из изображения JPEG включает в себя:

  • Поиск маркеров JPEG, в которых упоминается начало данных EXIF. например Обычно oxFFE1 является маркером, вставленным при кодировании EXIF-данных, который является сегментом APPlication, где идут данные EXIF.
  • Разберите все данные, скажем 0xFFE1, в 0xFFE2. Эти данные будут представлять собой поток байтов в файле с кодировкой JPEG.
  • ASCII эквивалент этих байтов будет содержать различную информацию, связанную с датой изображения, именем модели камеры, экспозицией и т.д.

Ответ 7

Инструмент командной строки ExifTool от Phil Harvey работает с десятками форматов изображений, включая множество патентованных форматов RAW, и может манипулировать различными форматы метаданных, включая EXIF, GPS, IPTC, XMP, JFIF.

Очень простое в использовании, легкое, впечатляющее приложение.