Практическое руководство. Чтение метаданных изображения
Некоторые файлы изображений содержат метаданные, которые можно прочитать, чтобы определить возможности изображения. Например цифровой фотографии может содержать метаданные, которые можно прочитать, чтобы определить марки и модели фотоаппарата, использованного для создания образа. С помощью GDI+, можно считывать существующие метаданные, и можно также добавлять новые метаданные в файлы изображений.
GDI+ хранит каждый отдельный блок метаданных в PropertyItem объекта. Можно прочитать PropertyItems свойство Image объекта для извлечения метаданных из файла. PropertyItems Свойство возвращает массив PropertyItem объектов.
Объект PropertyItem имеет следующие четыре свойства: Id, Value, Len, и Type.
Идентификатор
Тег, определяющий элемент метаданных. Некоторые значения, которые могут быть назначены Id показаны в следующей таблице.
| Шестнадцатеричное значение | Описание | 
|---|---|
| 0x0320 0x010F 0x0110 0x9003 0x829A 0x5090 0x5091 | Изображение заголовка Поставщик вычислительной техники Модель оборудования ExifDTOriginal Время выдержки EXIF Таблицы освещенности Таблицы цветности | 
Значение
Массив значений. Формат значений определяется Type свойство.
Len
Размер (в байтах) массив значений, на который указывает Value свойство.
Тип
Тип значений в массиве, на который указывает Value свойство. Типы, определяемые по Type в следующей таблице показаны значения свойств
| Числовое значение | Описание | 
|---|---|
| 1 | А Byte | 
| 2 | Массив Byteобъекты в кодировке ASCII | 
| 3 | 16-разрядное целое число | 
| 4 | 32-разрядное целое число | 
| 5 | Массив из двух Byteобъекты, представляющие рациональное число | 
| 6 | Не используется | 
| 7 | Не определено | 
| 8 | Не используется | 
| 9 | SLong | 
| 10 | SRational | 
Пример
Описание
В следующем примере кода считывает и отображает семи блоков метаданных в файле FakePhoto.jpg. Второй элемент свойства (индекс 1) в списке Id 0x010F (производитель) и Type 2 (массив байтов в кодировке ASCII). В примере кода отображает значение данного свойства.
В коде создается результат, аналогичный приведенному ниже:
Property Item 0
id: 0x320
type: 2
length: 16 bytes
Property Item 1
id: 0x10f
type: 2
length: 17 bytes
Property Item 2
id: 0x110
type: 2
length: 7 bytes
Property Item 3
id: 0x9003
type: 2
length: 20 bytes
Property Item 4
id: 0x829a
type: 5
length: 8 bytes
Property Item 5
id: 0x5090
type: 3
length: 128 bytes
Property Item 6
id: 0x5091
type: 3
length: 128 bytes
The equipment make is Northwind Camera.
Код
// Create an Image object. 
Image image = new Bitmap(@"c:\FakePhoto.jpg");
// Get the PropertyItems property from image.
PropertyItem[] propItems = image.PropertyItems;
// Set up the display.
Font font = new Font("Arial", 12);
SolidBrush blackBrush = new SolidBrush(Color.Black);
int X = 0;
int Y = 0;
// For each PropertyItem in the array, display the ID, type, and 
// length.
int count = 0;
foreach (PropertyItem propItem in propItems)
{
    e.Graphics.DrawString(
    "Property Item " + count.ToString(),
    font,
    blackBrush,
    X, Y);
    Y += font.Height;
    e.Graphics.DrawString(
       "   iD: 0x" + propItem.Id.ToString("x"),
       font,
       blackBrush,
       X, Y);
    Y += font.Height;
    e.Graphics.DrawString(
       "   type: " + propItem.Type.ToString(),
       font,
       blackBrush,
       X, Y);
    Y += font.Height;
    e.Graphics.DrawString(
       "   length: " + propItem.Len.ToString() + " bytes",
       font,
       blackBrush,
       X, Y);
    Y += font.Height;
    count++;
}
// Convert the value of the second property to a string, and display 
// it.
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
string manufacturer = encoding.GetString(propItems[1].Value);
e.Graphics.DrawString(
   "The equipment make is " + manufacturer + ".",
   font,
   blackBrush,
   X, Y);
Компиляция кода
Предыдущий пример предназначен для работы с Windows Forms и требует PaintEventArgs e, который является параметром Paint обработчик событий. Обработка формы Paint событий и вставьте этот код в обработчик событий paint. Необходимо заменить FakePhoto.jpg допустимы для системы и импорта путь и имя образа System.Drawing.Imaging пространства имен.