Поделиться через


Практическое руководство. Чтение метаданных изображения

Обновлен: Ноябрь 2007

Некоторые файлы с изображениями содержат метаданные, которые можно прочитать, чтобы определить свойства изображения. Например, цифровая фотография может содержать метаданные, которые позволяют определить модель камеры, с помощью которой была получена данная фотография. С помощью интерфейса GDI+ можно считывать существующие метаданные, а также добавлять новые метаданные в файлы с изображениями.

Интерфейс GDI+ хранит каждый отдельный блок метаданных в объекте PropertyItem. Чтобы получить все метаданные файла, можно прочитать свойство PropertyItems объекта Image. Свойство PropertyItems возвращает массив объектов PropertyItem.

Объект PropertyItem имеет следующие четыре свойства: Id, Value, Len и Type.

Id

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

Шестнадцатеричное значение

Описание

0x0320

0x010F

0x0110

0x9003

0x829A

0x5090

0x5091

Название изображения

Производитель оборудования

Модель оборудования

ExifDTOriginal

Exif — время выдержки

Таблица светимости

Таблица хроматических данных

Значение

Массив значений. Формат значений определяется свойством Type.

Len

Размер (в байтах) массива значений, на который указывает свойство Value.

Type

Тип элементов массива, на который указывает свойство 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 (массив объектов byte в кодировке 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. 
Dim image As Bitmap = New Bitmap("c:\FakePhoto.jpg")

'Get the PropertyItems property from image.
Dim propItems As PropertyItem() = image.PropertyItems

'Set up the display.
Dim font As New Font("Arial", 12)
Dim blackBrush As New SolidBrush(Color.Black)
Dim X As Integer = 0
Dim Y As Integer = 0

'For each PropertyItem in the array, display the ID, type, and length.
Dim count As Integer = 0
Dim propItem As PropertyItem
For Each 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 += 1
Next propItem
'Convert the value of the second property to a string, and display it.
Dim encoding As New System.Text.ASCIIEncoding()
Dim manufacturer As String = encoding.GetString(propItems(1).Value)

e.Graphics.DrawString( _
   "The equipment make is " & manufacturer & ".", _
   font, _
   blackBrush, _
   X, Y)

// 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. Подставьте вместо FakePhoto.jpg имя имеющегося на вашем компьютере файла изображения и путь к нему.

См. также

Другие ресурсы

Работа с растровыми и векторными изображениями с использованием классов Image, Bitmap и Metafile

Работа с растровыми и векторными изображениями