Procedimiento para leer metadatos de imagen

Algunos archivos de imagen contienen metadatos que se pueden leer para determinar las características de la imagen. Por ejemplo, una fotografía digital podría contener metadatos que se pueden leer para determinar la marca y el modelo de la cámara empleada para capturar la imagen. Con GDI+, puede leer los metadatos existentes y escribir metadatos nuevos en archivos de imagen.

GDI+ almacena un fragmento de metadatos individual en un objeto PropertyItem. Puede leer la propiedad PropertyItems de un objeto Image para recuperar todos los metadatos de un archivo. La propiedad PropertyItems devuelve una matriz de objetos PropertyItem.

Un objeto PropertyItem tiene las cuatro propiedades siguientes: Id, Value, Len y Type.

Identificador

Etiqueta que identifica el elemento de metadatos. En la tabla siguiente se muestran algunos de los valores que se pueden asignar a Id:

Valor hexadecimal Descripción
0x0320

0x010F

0x0110

0x9003

0x829A

0x5090

0x5091
Título de la imagen

Fabricante del equipo

Modelo del equipo

ExifDTOriginal

Tiempo de exposición de EXIF

Tabla de luminancia

Tabla de crominancia

Valor

Matriz de valores . El formato de los valores viene determinado por la propiedad Type.

Len

Longitud (en bytes) de la matriz de valores a los que apunta la propiedad Value.

Tipo

Tipo de datos de los valores de la matriz a los que apunta la propiedad Value. Los formatos que indican los valores de propiedad Type se muestran en la tabla siguiente:

Valor numérico Descripción
1 Una operación Byte
2 Matriz de objetos Byte codificados como ASCII
3 Entero de 16 bits
4 Entero de 32 bits
5 Matriz de dos objetos Byte que representan un número racional
6 No se usa
7 No definido
8 No se usa
9 SLong
10 SRational

Ejemplo

En el ejemplo de código siguiente se leen y se muestran los siete fragmentos de metadatos del archivo FakePhoto.jpg. El segundo elemento de propiedad (índice 1) de la lista tiene como Id 0x010F (fabricante del equipo) y como Type 2 (matriz de bytes con codificación ASCII). En el ejemplo de código se muestra el valor de ese elemento de propiedad.

// 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);
'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)

El código genera un resultado similar al siguiente:

 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.

Compilar el código

El ejemplo anterior está diseñado para su uso con Windows Forms y requiere PaintEventArgse, que es un parámetro del controlador de eventos Paint. Controle el evento Paint del formulario y pegue este código en el controlador de eventos Paint. Debe reemplazar FakePhoto.jpg por un nombre de imagen y una ruta de acceso válidos en el sistema e importar el espacio de nombres System.Drawing.Imaging.

Consulte también