Как получить данные 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/...
Ответ 3
Вот ссылка на другой аналогичный вопрос SO, в котором есть ответ, указывающий на эту хорошую статью на "Чтение, запись и фото метаданные" в .Net.
Ответ 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.
Очень простое в использовании, легкое, впечатляющее приложение.