Я хотел бы написать небольшую программу на C#, которая просматривает мои фотографии в формате jpeg и, например, сортирует их по датированным папкам (используя МОИ соглашения о свиданиях, черт возьми ...).
Кто-нибудь знает относительно простой способ получить данные EXIF, такие как дата и время или экспозиция, программно? Спасибо!
Почему это было закрыто? Он фокусируется на одной проблеме, получении EXIT из файлов. Также есть четкий и конкретный ответ.





Получение данных EXIF из изображения JPEG включает в себя:
Класс изображения имеет свойства PropertyItems и PropertyIdList. Вы можете их использовать.
Кажется, он только для чтения, поэтому я не могу добавить ничего в новый образ ...
Используйте функцию Image.SetPropertyItem (PropertyItem) для нового изображения.
Обратите внимание на этот экстрактор метаданных. Он написан на 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).
Вот ссылка на другой аналогичный вопрос SO, ответ на который указывает на эту хорошую статью о «Чтение, запись и фото метаданных» в .Net.
Альтернативный вопрос с очень хороший ответэто здесь, который указывает на ExifLib - быстрое извлечение данных Exif для .NET 2.0+
Как было предложено, вы можете использовать какую-нибудь стороннюю библиотеку или сделать это вручную (что не так уж и сложно), но самый простой и гибкий - это, возможно, использование встроенных функций в .NET. Для получения дополнительной информации см .:
System.Drawing.Image.PropertyItems Имущество
Я говорю «это самый гибкий», потому что .NET не пытается каким-либо образом интерпретировать или объединять данные. Для каждого EXIF вы в основном получаете массив байтов. Это может быть хорошо или плохо, в зависимости от того, какой контроль вы на самом деле хотите.
Также я должен отметить, что список свойств на самом деле не соответствует напрямую значениям EXIF. Сам EXIF хранится в нескольких таблицах с перекрывающимися идентификаторами, но .NET помещает все в один список и переопределяет идентификаторы некоторых элементов. Но до тех пор, пока вас не интересуют точные идентификаторы EXIF, вам должно быть хорошо с сопоставлением .NET.
Редактировать: Это можно сделать без загрузки полного изображения после этого ответа: https://stackoverflow.com/a/552642/2097240
Для доступа к Bitmap.PropertyItems требуется чтение всего файла в память. Если вы создаете Bitmap, получаете доступ к PropertyItems и больше ничего не делаете, вы можете использовать XPerf, чтобы увидеть, что ваше приложение получило доступ к файлу изображения и прочитало его все в память. Для моего компьютера файл размером 3,4 МБ стоит> 700 мс ввода-вывода, просто чтобы получить EXIF через PropertyItems :(.
Для сравнения, PhotoViewer в Picasa считывает всего 20–30 КБ из каждого файла, которого он касается. Эти чтения стоят всего ~ 25 мсек. Вау; Я бы хотел поболтать с парнем / девушкой, которые написали эти вещи. (Данные были собраны путем профилирования запуска PhotoViewer с помощью XPerf).
@Tristan: Полезная информация, но как часто вы обращаетесь к метаданным изображения, не желая при этом самого изображения? Я уверен, что есть некоторые случаи, но я думаю, что в большинстве случаев можно было бы отображать изображение (или иным образом работать с его данными) И это метаданные одновременно.
@jrista Как часто мне нужны только метаданные? Большую часть времени. Например, представьте, что вы хотите отсортировать или отфильтровать набор изображений по части метаданных. Сортировка по дате съемки - довольно обычное дело, и чтобы получить эту информацию, вам нужно обратиться к метаданным.
@ Тристан: Но что ты сортируешь? Отображение миниатюр в виде сетки? Просто скажу, по крайней мере, во многих случаях, которые я могу придумать, вам понадобится изображение достаточно часто. Я подозреваю, что вы бы тоже кешировали недавно полученную информацию. Я думаю, что в наши дни это немного спорный вопрос, хотя ... новая среда WPF media & imaging framework поддерживает чтение всех метаданных, EXIF и IPTC, и она будет загружать только те данные, которые действительно необходимы. Если вам нужен эффективный доступ к метаданным, просто используйте новую платформу WPF вместо старой структуры GDI, и вы получите желаемую эффективность.
Мы как бы уходим от темы. Если хотите, я буду рад продолжить работу в качестве PM.
В этом ответе показано, как это сделать с PropertyItemsбез загрузки всего изображения: stackoverflow.com/a/552642
Инструмент командной строки ExifTool от Фила Харви работает с десятками форматов изображений, включая множество проприетарных форматов RAW, и может управлять различными форматами метаданных, включая EXIF, GPS, IPTC, XMP, JFIF.
Очень простое в использовании, легкое, впечатляющее приложение.
ExifTool - замечательная библиотека / инструмент, но она написана на Perl, поэтому ее использование из C# требует запуска внешнего процесса.
Недавно использовал этот .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);
}
}
Встроенная поддержка метаданных изображений в BCL весьма ограничена. Я работаю с метаданными, такими как Exif, с 2002 года, и у меня есть простой, но мощный библиотека для извлечения таких данных для .NET.