Vorgehensweise: Lesen von Bildmetadaten

Einige Bilddateien enthalten Metadaten, die Sie lesen können, um Merkmale des Bilds zu bestimmen. Beispielsweise kann ein digitales Foto Metadaten enthalten, die Sie lesen können, um Marke und Modell der Kamera zu bestimmen, die zum Aufnehmen des Bilds verwendet wurde. Mit GDI+ können Sie vorhandene Metadaten lesen, und Sie können auch neue Metadaten in Bilddateien schreiben.

GDI+ speichert ein einzelnes Metadatenelement in einem PropertyItem-Objekt. Sie können die PropertyItems-Eigenschaft eines Image-Objekts lesen, um alle Metadaten aus einer Datei abzurufen. Die PropertyItems-Eigenschaft gibt ein Array von PropertyItem-Objekten zurück.

Ein PropertyItem-Objekt weist die folgenden vier Eigenschaften auf: Id, Value, Len und Type.

Id

Ein Tag, das das Metadatenelement identifiziert. Einige Werte, die zu Id zugewiesen werden können, sehen Sie in der folgenden Tabelle:

Hexadezimalwert BESCHREIBUNG
0x0320

0x010F

0x0110

0x9003

0x829A

0x5090

0x5091
Bildtitel

Gerätehersteller

Gerätemodell

ExifDTOriginal

Exif-Belichtungszeit

Leuchtdichtetabelle

Chrominanztabelle

Wert

Ein Array von -Werten. Das Format der Werte wird durch die Type-Eigenschaft bestimmt.

Len

Die Länge (in Bytes) des Wertearrays, auf das die Value-Eigenschaft verweist.

type

Der Datentyp der Werte im Array, auf die die Value-Eigenschaft verweist. Die von den Type-Eigenschaftswerten angegebenen Formate sind in der folgenden Tabelle zu sehen:

Numerischer Wert BESCHREIBUNG
1 Einen Byte
2 Ein Array von Byte-Objekten, die als ASCII codiert sind.
3 Eine 16-Bit-Ganzzahl.
4 Eine 32-Bit-Ganzzahl.
5 Ein Array von zwei Byte-Objekten, die eine rationale Zahl darstellen.
6 Nicht verwendet
7 Nicht definiert
8 Nicht verwendet
9 SLong
10 SRational

Beispiel

Im folgenden Codebeispiel werden die sieben Metadatenelemente in der Datei FakePhoto.jpg gelesen und angezeigt. Das zweite (Index 1) Eigenschaftselement in der Liste weist Id 0x010F (Gerätehersteller) und Type 2 (ASCII-codiertes Bytearray) auf. Im Codebeispiel wird der Wert dieses Eigenschaftselements angezeigt.

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

Der Code erzeugt eine Ausgabe ähnlich der folgenden:

 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.

Kompilieren des Codes

Das obige Beispiel ist für die Verwendung mit Windows Forms konzipiert und erfordert PaintEventArgs e, einen Parameter des Paint-Ereignishandlers. Behandeln Sie das Paint-Ereignis des Formulars, und fügen Sie diesen Code in den Paint-Ereignishandler ein. Sie müssen FakePhoto.jpg durch einen Bildnamen und -pfad ersetzen, die auf Ihrem System gültig sind, und den System.Drawing.Imaging-Namespace importieren.

Weitere Informationen