Anvisningar: Läsa bildmetadata

Vissa bildfiler innehåller metadata som du kan läsa för att fastställa funktionerna i bilden. Ett digitalt fotografi kan till exempel innehålla metadata som du kan läsa för att fastställa kamerans märke och modell som används för att avbilda bilden. Med GDI+ kan du läsa befintliga metadata och du kan också skriva nya metadata till bildfiler.

GDI+ lagrar en enskild bit metadata i ett PropertyItem objekt. Du kan läsa egenskapen PropertyItems för ett Image objekt för att hämta alla metadata från en fil. Egenskapen PropertyItems returnerar en matris med PropertyItem objekt.

Ett PropertyItem objekt har följande fyra egenskaper: Id, Value, Lenoch Type.

Id

En tagg som identifierar metadataobjektet. Vissa värden som kan tilldelas till Id visas i följande tabell:

Hexadecimalt värde Beskrivning
0x0320

0x010F

0x0110

0x9003

0x829A

0x5090

0x5091
Bildrubrik

Utrustningstillverkare

Utrustningsmodell

ExifDTOriginal

Exif exponeringstid

Luminanstabell

Krominans-tabell

Värde

En matris med värden. Formatet på värdena bestäms av egenskapen Type.

Len

Längden (i byte) på matrisen med värden som pekas på av egenskapen Value.

Typ

Datatypen för värdena i matrisen som pekas på av egenskapen Value. Det format som anges av Type-egenskapsvärdena visas i tabellen nedan:

Numeriskt värde Beskrivning
1 En Byte
2 En matris med Byte objekt som kodas som ASCII
3 Ett 16-bitars heltal
4 Ett 32-bitars heltal
5 En matris med två Byte objekt som representerar ett rationellt tal
6 Används inte
7 Odefinierad
8 Används inte
9 SLong
10 SRational

Exempel

Följande kodexempel läser och visar de sju metadatadelarna i filen FakePhoto.jpg. Det andra (index 1)-egenskapsobjektet i listan har Id 0x010F (utrustningstillverkare) och Type 2 (ASCII-kodad bytematris). Kodexemplet visar värdet för det egenskapsobjektet.

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

Koden genererar utdata som liknar följande:

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.

Kompilera koden

Föregående exempel är utformat för användning med Windows Forms och kräver PaintEventArgse, som är en parameter för Paint händelsehanterare. Hantera formulärets Paint händelse och klistra in den här koden i färghändelsehanteraren. Du måste ersätta FakePhoto.jpg med ett bildnamn och en giltig sökväg på ditt system och importera System.Drawing.Imaging namespace.

Se även