Cómo: Leer metadatos de imagenHow to: Read Image Metadata

Algunos archivos de imagen contienen metadatos que se pueden leer para determinar las características de la imagen.Some image files contain metadata that you can read to determine features of the image. Por ejemplo, una fotografía digital podría contener metadatos que puede leer para determinar la marca y el modelo de la cámara utilizada para capturar la imagen.For example, a digital photograph might contain metadata that you can read to determine the make and model of the camera used to capture the image. Con GDI+, puede leer los metadatos existentes y también puede escribir nuevos metadatos en archivos de imagen.With GDI+, you can read existing metadata, and you can also write new metadata to image files.

GDI+ almacena un elemento individual de metadatos en un objeto de PropertyItem.GDI+ stores an individual piece of metadata in a PropertyItem object. Puede leer la propiedad PropertyItems de un objeto Image para recuperar todos los metadatos de un archivo.You can read the PropertyItems property of an Image object to retrieve all the metadata from a file. La propiedad PropertyItems devuelve una matriz de objetos PropertyItem.The PropertyItems property returns an array of PropertyItem objects.

Un objeto PropertyItem tiene las cuatro propiedades siguientes: Id, Value, Leny Type.A PropertyItem object has the following four properties: Id, Value, Len, and Type.

Id.Id

Etiqueta que identifica el elemento de metadatos.A tag that identifies the metadata item. En la tabla siguiente se muestran algunos valores que se pueden asignar a Id:Some values that can be assigned to Id are shown in the following table:

Valor hexadecimalHexadecimal value DescripciónDescription
0x03200x0320

0x010F0x010F

0x01100x0110

0x90030x9003

0x829A0x829A

0x50900x5090

0x50910x5091
Título de la imagenImage title

Fabricante de equiposEquipment manufacturer

Modelo de equipoEquipment model

ExifDTOriginalExifDTOriginal

Hora de exposición de ExifExif exposure time

Tabla de luminanciaLuminance table

Tabla de crominanciaChrominance table

ValorValue

Matriz de valores.An array of values. El formato de los valores viene determinado por la propiedad Type.The format of the values is determined by the Type property.

LenLen

La longitud (en bytes) de la matriz de valores a la que apunta la propiedad Value.The length (in bytes) of the array of values pointed to by the Value property.

TypeType

El tipo de datos de los valores de la matriz a la que apunta la propiedad Value.The data type of the values in the array pointed to by the Value property. Los formatos indicados por los valores de la propiedad Type se muestran en la tabla siguiente:The formats indicated by the Type property values are shown in the following table:

Valor numéricoNumeric value DescripciónDescription
11 Byte.A Byte
22 Matriz de objetos Byte codificados como ASCIIAn array of Byte objects encoded as ASCII
33 Entero de 16 bitsA 16-bit integer
44 Un entero de 32 bitsA 32-bit integer
55 Matriz de dos objetos Byte que representan un número racionalAn array of two Byte objects that represent a rational number
66 No se utilizaNot used
77 Sin definirUndefined
88 No se utilizaNot used
99 SLong
1010 SRational

EjemploExample

En el siguiente ejemplo de código se leen y muestran los siete fragmentos de metadatos del archivo FakePhoto.jpg.The following code example reads and displays the seven pieces of metadata in the file FakePhoto.jpg. El segundo elemento de propiedad (Índice 1) de la lista tiene Id 0x010F (fabricante del equipo) y Type 2 (matriz de bytes codificada en ASCII).The second (index 1) property item in the list has Id 0x010F (equipment manufacturer) and Type 2 (ASCII-encoded byte array). En el ejemplo de código se muestra el valor de ese elemento de propiedad.The code example displays the value of that property item.

// 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 una salida similar a la siguiente:The code produces output similar to the following:

 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ódigoCompiling the Code

El ejemplo anterior está diseñado para su uso con Windows Forms y requiere PaintEventArgs e, que es un parámetro del controlador de eventos Paint.The preceding example is designed for use with Windows Forms, and it requires PaintEventArgs e, which is a parameter of the Paint event handler. Controle el evento de Paint del formulario y péguelo en el controlador de eventos Paint.Handle the form's Paint event and paste this code into the paint event handler. Debe reemplazar FakePhoto.jpg por un nombre de imagen y una ruta de acceso válidas en el sistema e importar el espacio de nombres System.Drawing.Imaging.You must replace FakePhoto.jpg with an image name and path valid on your system and import the System.Drawing.Imaging namespace.

Vea tambiénSee also