В предыдущем посте мы обсуждали, как работать с EXIF-данными изображений в Java. Сегодня мы рассмотрим достижение того же самого, но на C#. Если вы не посещали предыдущую публикацию, но хотите извлекать, обновлять, добавлять или удалять данные EXIF ваших изображений программно на C#, эта статья поможет вам в этом. Мы рассмотрим следующие способы работы с данными EXIF в C#:

Библиотека C# для управления метаданными

API метаданных .NET от GroupDocs

GroupDocs.Metadata for .NET — это .NET API для управления метаданными. Он имеет длинный список функций для самых разных поддерживаемых форматов файлов. Он может не только извлекать метаданные из изображений, но также может добавлять, редактировать, обновлять и удалять метаданные из изображений и документов с различными параметрами.

В этой статье мы будем использовать этот API, поэтому обязательно скачайте его двоичные файлы или установите API из NuGet.

Чтение данных EXIF из изображений в C#

Вы можете легко прочитать свойства данных EXIF, выполнив указанные шаги. Начиная с извлечения данных EXIF из этого изображения, 93-метровая статуя Свободы. Здесь мы будем использовать файл JPG в качестве примера изображения, однако мы можем использовать любой файл, будь то PNG, WebP, BMP, GIF, TIFF или любой другой из поддерживаемых форматов файлов, упомянутых в конце эта статья.

Изображение Liberty JPG для данных EXIF
  • Загрузите исходный файл изображения, содержащий данные EXIF, с помощью конструктора класса Metadata.
  • Получите его корневой пакет, вызвав метод GetRootPackage().
  • Из корневого пакета получите его ExifPackage из его свойства ExifPackage.
  • Получив пакет EXIF, вы можете получить доступ к свойствам EXIF изображения; например Производитель, Модель, Ширина, Длина, ДатаВремя, Авторские права, Программное обеспечение и т. д., как показано ниже в примере кода C#.
// Extract EXIF Data Package Information from image in C#
using (Metadata metadata = new Metadata("statue-of-liberty.jpg"))
{
    IExif root = metadata.GetRootPackage() as IExif;
    if (root != null && root.ExifPackage != null)
    {
        Console.WriteLine(root.ExifPackage.Make);
        Console.WriteLine(root.ExifPackage.Model);
        Console.WriteLine(root.ExifPackage.ImageWidth);
        Console.WriteLine(root.ExifPackage.ImageLength);
        Console.WriteLine(root.ExifPackage.DateTime);
     }
}

Приведенный выше код отобразит следующую доступную информацию EXIF для предоставленного изображения JPG.

Make : NIKON CORPORATION
Model : NIKON D7200 
Width : 640
Length : 384
DateTime : 2018:07:06 19:31:05

Чтение информации EXIF IFD и GPS изображения

Данные EXIF также включают информацию Exif IFD (каталог файлов изображений) и GPS (глобальная система позиционирования). Теперь для получения информации о пакетах IFD и GPS вам просто нужно получить доступ к соответствующим свойствам пакета EXIF, т.е. ExifIfdPackage или GpsPackage. Из этих пакетов можно извлечь гораздо больше информации, чем указано ниже:

  • Серийный номер устройства
  • Имя владельца камеры
  • Шаблон CFA
  • Скорость
  • Направление изображения
  • Штамп с датой
  • Информация о районе
  • Высота
  • Широта
  • Долгота
  • так далее.

Нижеприведенный код может быть добавлен в указанный выше метод для отображения данных EXIF вместе с информацией IFD и GPS.

// Display EXIF IFD Package Properties like Serial Number and Camera Owner.
Console.WriteLine(root.ExifPackage.ExifIfdPackage.BodySerialNumber);
Console.WriteLine(root.ExifPackage.ExifIfdPackage.CameraOwnerName);
Console.WriteLine(root.ExifPackage.ExifIfdPackage.UserComment);
// Display EXIF GPS Information like Latitude, Longitude, etc.
Console.WriteLine(root.ExifPackage.GpsPackage.Altitude);
Console.WriteLine(root.ExifPackage.GpsPackage.LatitudeRef);
Console.WriteLine(root.ExifPackage.GpsPackage.LongitudeRef);

Чтение всех тегов EXIF изображений в C#

Вы можете извлечь все свойства EXIF любого изображения, вы можете сделать это почти так же, как описано выше:

  • Загрузите изображение с помощью конструктора Metadata.
  • Получите корневой пакет, вызвав метод GetRootPackage().
  • Получите пакет EXIF из свойства ExifPackage корневого пакета.
  • Повторите пакет EXIF и получите желаемые пары “имя-значение”.
  • Точно так же заставьте пакеты IFD и GPS отображать свои ключи и значения.
// Extract all EXIF Metadata from the image
using (Metadata metadata = new Metadata("statue-of-liberty.jpg"))
{
    IExif root = metadata.GetRootPackage() as IExif;
    if (root != null && root.ExifPackage != null)
    {
        const string pattern = "{0} = {1}";
        // Read all EXIF Package Tags and values.
        foreach (TiffTag tag in root.ExifPackage.ToList()) {
            Console.WriteLine(pattern, tag.Name, tag.Value);
        }
        // Read all EXIF IFD Package Tags and values.
        foreach (TiffTag tag in root.ExifPackage.ExifIfdPackage.ToList()) {
            Console.WriteLine(pattern, tag.Name, tag.Value);
        }
         // Read all EXIF GPS Package Tags and values.
        foreach (TiffTag tag in root.ExifPackage.GpsPackage.ToList()) {
            Console.WriteLine(pattern, tag.Name, tag.Value);
        }
    }
}

Обновление свойств EXIF в C#

Вы можете легко изменить существующие данные EXIF любого изображения. Ниже приведены шаги, которые вы можете выполнить:

Обновить пакет EXIF

  • Получите корневой пакет, вызвав метод GetRootPackage().
  • Установите свойства ExifPackage, назначив новые значения соответствующим свойствам, например, присвоив новое значение:
    • root.ExifPackage.Copyright — для установки обновленной информации об авторских правах.
  • Точно так же вы можете установить значения для исполнителя, производителя, модели, программного обеспечения, ширины и высоты изображения, даты и времени и т. д.

Обновление пакета EXIF IFD

Подобно настройке свойств пакета EXIF, мы можем обновить свойства пакетов EXIF IFD и GPS.

  • Присвойте значение root.ExifPackage.ExifIfdPackage.CameraOwnerName, чтобы установить владельца камеры.

Вы можете посетить классы ExifIfdPackage или ExifGpsPackage, чтобы получить представление о том, сколько вы можете настроить для своих изображений.

// Update or change new values in EXIF Data (EXIF Package & EXIF IFD Package).
using (Metadata metadata = new Metadata("statue-of-liberty.jpg"))
{
    IExif root = metadata.GetRootPackage() as IExif;
    if (root != null)
    {
        // Set the EXIF package if it is missing
        if (root.ExifPackage == null) {
            root.ExifPackage = new ExifPackage();
        }
       // Setting the desired values in EXIF Package and EXIF IFD Package.
        root.ExifPackage.Copyright = "Copyright (C) 2011-2020 GroupDocs. All Rights Reserved.";
        root.ExifPackage.ImageDescription = "Statue of Liberty for EXIF Data";
        root.ExifPackage.Software = "GroupDocs.Metadata for .NET"; 
        root.ExifPackage.ExifIfdPackage.BodySerialNumber = "GD-2020";
        root.ExifPackage.ExifIfdPackage.CameraOwnerName = "GroupDocs";
        root.ExifPackage.ExifIfdPackage.UserComment = "Nice image captured in 2018";
        metadata.Save("statue-of-liberty-updated.jpg");
    }
}

Удалить метаданные EXIF из изображений в C#

Если вы хотите удалить пакет EXIF из любого файла, просто установите для его свойства ExifPackage значение null.

// Removing the EXIF data from an image.
using (Metadata metadata = new Metadata("statue-of-liberty.jpg"))
{
    IExif root = metadata.GetRootPackage() as IExif;
    if (root != null)
    {
        root.ExifPackage = null;
        metadata.Save("statue-of-liberty-no-exif.jpg");
    }
}

Поддерживаемые изображения и другие форматы

Это поддерживаемые в настоящее время форматы файлов GroupDocs.Metadata для данных EXIF изображений, аудио и видео. Вы всегда можете посетить документацию для получения обновленной информации.

Тип документа Форматы файлов
Изображения BMP, GIF, JPG, JPEG, JPE, JP2, PNG, DJVU, DWG, DXF, WebP, TIFF, PSD, EMF, WMF
Аудио и видео MP3, WAV, AVI, MOV/QT, FLV, ASF, DICOM

Подробнее о GroupDocs.Metadata

Давайте поговорим подробнее @ Бесплатный форум поддержки.

Связанная статья