Как получить данные EXIF из файла с помощью C# [закрыто]
-
09-06-2019 - |
Вопрос
Я хотел бы написать небольшую программу на C #, которая просматривает мои фотографии в формате JPEG и, например, сортирует их по датированным папкам (используя МОИ соглашения о датировке, черт возьми...).
Кто-нибудь знает относительно простой способ программно получить данные EXIF, такие как дата и время или экспозиция?Спасибо!
Решение
Проверьте это экстрактор метаданных. Он написан на Java, но также портирован на C#. Я использовал версию Java для написания небольшой утилиты для переименования моих файлов JPEG на основе тегов даты и модели.Очень прост в использовании.
РЕДАКТИРОВАТЬ экстрактор метаданных также поддерживает .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.
Другие советы
Как было предложено, вы можете использовать какую-либо стороннюю библиотеку или сделать это вручную (что не так уж и сложно), но самым простым и гибким является использование встроенных функций .NET.Подробнее см.:
System.Drawing.Image.PropertyItems Свойство
Я говорю «он самый гибкий», потому что .NET не пытается каким-либо образом интерпретировать или объединять данные.Для каждого EXIF вы получаете массив байтов.Это может быть хорошо или плохо в зависимости от того, какой уровень контроля вам действительно нужен.
Кроме того, я должен отметить, что список свойств на самом деле не соответствует напрямую значениям EXIF.Сам EXIF хранится в нескольких таблицах с перекрывающимися идентификаторами, но .NET помещает все в один список и переопределяет идентификаторы некоторых элементов.Но пока вас не волнуют точные идентификаторы EXIF, у вас все будет в порядке с сопоставлением .NET.
Вот ссылка на другой аналогичный вопрос SO, в котором есть ответ, указывающий на эту хорошую статью о «Чтение, запись и метаданные фотографий» в .Net.
Вы можете использовать Библиотека тегов# который используется такими приложениями, как F-точка.Помимо Exif, он читает большое количество форматов метаданных для изображений, аудио и видео.
Мне также нравится ExifUtils API, но он глючный и активно не развивается.
Класс изображения имеет свойства PropertyItems и PropertyIdList.Вы можете использовать их.
Получение данных EXIF из изображения JPEG включает в себя:
- Ищем маркеры JPEG, в которых упоминается начало данных EXIF.напримеробычно oxFFE1 — это маркер, вставленный при кодировании данных EXIF, который представляет собой сегмент APPlication, куда передаются данные EXIF.
- Проанализируйте все данные, скажем, от 0xFFE1 до 0xFFE2.Эти данные будут представлять собой поток байтов в файле в формате JPEG.
- ASCII-эквивалент этих байтов будет содержать различную информацию, связанную с датой изображения, названием модели камеры, экспозицией и т. д.
Инструмент командной строки ExifTool от Фила Харви работает с десятками форматов изображений, включая множество собственных форматов RAW, и может работать с различными форматами метаданных, включая EXIF, GPS, IPTC, XMP, JFIF.
Очень простое в использовании, легкое, впечатляющее приложение.