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

Я хотел бы написать небольшую программу на C#, которая просматривает мои фотографии в формате jpeg и, например, сортирует их по датированным папкам (используя МОИ соглашения о свиданиях, черт возьми ...).

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

Встроенная поддержка метаданных изображений в BCL весьма ограничена. Я работаю с метаданными, такими как Exif, с 2002 года, и у меня есть простой, но мощный библиотека для извлечения таких данных для .NET.

Drew Noakes 10.07.2015 01:54

Почему это было закрыто? Он фокусируется на одной проблеме, получении EXIT из файлов. Также есть четкий и конкретный ответ.

mafu 24.03.2020 05:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
77
2
123 736
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

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

Кажется, он только для чтения, поэтому я не могу добавить ничего в новый образ ...

TigrouMeow 05.08.2009 06:16

Используйте функцию Image.SetPropertyItem (PropertyItem) для нового изображения.

Morten Christiansen 18.11.2009 15:50
Ответ принят как подходящий

Обратите внимание на этот экстрактор метаданных. Он написан на 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.

Это замечательно, если ваше приложение для Windows всегда показывает изображения iPhone боком или вверх ногами. В каждом изображении есть тег Orientation, который обычно является магическим числом, но эта библиотека сообщает вам поворот (например, Rotate 180 или Rotate 90 CCW).

Chris Akridge 13.01.2020 00:07

Вот ссылка на другой аналогичный вопрос SO, ответ на который указывает на эту хорошую статью о «Чтение, запись и фото метаданных» в .Net.

Альтернативный вопрос с очень хороший ответэто здесь, который указывает на ExifLib - быстрое извлечение данных Exif для .NET 2.0+

S.Serpooshan 24.06.2017 09:19

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

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

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


Редактировать: Это можно сделать без загрузки полного изображения после этого ответа: https://stackoverflow.com/a/552642/2097240

Для доступа к Bitmap.PropertyItems требуется чтение всего файла в память. Если вы создаете Bitmap, получаете доступ к PropertyItems и больше ничего не делаете, вы можете использовать XPerf, чтобы увидеть, что ваше приложение получило доступ к файлу изображения и прочитало его все в память. Для моего компьютера файл размером 3,4 МБ стоит> 700 мс ввода-вывода, просто чтобы получить EXIF ​​через PropertyItems :(.

Tristan 07.08.2011 02:53

Для сравнения, PhotoViewer в Picasa считывает всего 20–30 КБ из каждого файла, которого он касается. Эти чтения стоят всего ~ 25 мсек. Вау; Я бы хотел поболтать с парнем / девушкой, которые написали эти вещи. (Данные были собраны путем профилирования запуска PhotoViewer с помощью XPerf).

Tristan 09.08.2011 18:32

@Tristan: Полезная информация, но как часто вы обращаетесь к метаданным изображения, не желая при этом самого изображения? Я уверен, что есть некоторые случаи, но я думаю, что в большинстве случаев можно было бы отображать изображение (или иным образом работать с его данными) И это метаданные одновременно.

jrista 26.11.2013 12:21

@jrista Как часто мне нужны только метаданные? Большую часть времени. Например, представьте, что вы хотите отсортировать или отфильтровать набор изображений по части метаданных. Сортировка по дате съемки - довольно обычное дело, и чтобы получить эту информацию, вам нужно обратиться к метаданным.

Tristan 26.11.2013 23:28

@ Тристан: Но что ты сортируешь? Отображение миниатюр в виде сетки? Просто скажу, по крайней мере, во многих случаях, которые я могу придумать, вам понадобится изображение достаточно часто. Я подозреваю, что вы бы тоже кешировали недавно полученную информацию. Я думаю, что в наши дни это немного спорный вопрос, хотя ... новая среда WPF media & imaging framework поддерживает чтение всех метаданных, EXIF ​​и IPTC, и она будет загружать только те данные, которые действительно необходимы. Если вам нужен эффективный доступ к метаданным, просто используйте новую платформу WPF вместо старой структуры GDI, и вы получите желаемую эффективность.

jrista 27.11.2013 04:50

Мы как бы уходим от темы. Если хотите, я буду рад продолжить работу в качестве PM.

Tristan 27.11.2013 21:31

В этом ответе показано, как это сделать с PropertyItemsбез загрузки всего изображения: stackoverflow.com/a/552642

Daniel Möller 02.10.2019 19:26

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

Мне также нравится ExifUtils API, но он глючит и активно не развивается.

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

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

ExifTool - замечательная библиотека / инструмент, но она написана на Perl, поэтому ее использование из C# требует запуска внешнего процесса.

Drew Noakes 28.07.2015 00:39

Недавно использовал этот .NET Metadata API. Я также написал об этом Сообщение блога, в котором показано чтение, обновление и удаление данных EXIF ​​из изображений с использованием C#.

using (Metadata metadata = new Metadata("image.jpg"))
{
    IExif root = metadata.GetRootPackage() as IExif;
    if (root != null && root.ExifPackage != null)
    {
        Console.WriteLine(root.ExifPackage.DateTime);
     }
}

Другие вопросы по теме