Sdílet prostřednictvím


Postupy: Čtení metadat obrázku

Některé soubory obrázků obsahují metadata, která si můžete přečíst za účelem určení funkcí obrázku. Digitální fotografie může například obsahovat metadata, která si můžete přečíst, abyste určili, jak vytvořit a model fotoaparátu použitého k zachycení obrázku. Pomocí rozhraní GDI+ můžete číst existující metadata a do souborů obrázků můžete také zapisovat nová metadata.

GDI+ ukládá jednotlivou část metadat v objektu PropertyItem . Můžete číst vlastnost Image objektu PropertyItems a načíst všechna metadata ze souboru. Vlastnost PropertyItems vrátí pole PropertyItem objektů.

Objekt PropertyItem má následující čtyři vlastnosti: Id, Value, Lena Type.

ID

Značka, která identifikuje položku metadat. Některé hodnoty, ke kterým Id je možné přiřadit, jsou uvedeny v následující tabulce:

Šestnáctková hodnota Popis
0x0320

0x010F

0x0110

0x9003

0x829A

0x5090

0x5091
Název obrázku

Výrobce zařízení

Model vybavení

ExifDTOriginal

Exif exposure time

Tabulka Světelnost

Tabulka chrominance

Hodnota

Matice hodnot. Formát hodnot je určen Type vlastností.

Len

Délka (v bajtech) pole hodnot odkazovaných na Value vlastnost.

Typ

Datový typ hodnot v poli, na který Value odkazuje vlastnost. Formáty označené Type hodnotami vlastností jsou uvedeny v následující tabulce:

Číselná hodnota Popis
1 Provede Byte.
2 Pole Byte objektů kódovaných jako ASCII
3 16bitové celé číslo
4 32bitové celé číslo
5 Pole dvou Byte objektů, které představují logické číslo
6 Nepoužívá se.
7 Nedefinováno
8 Nepoužívá se.
9 SLong
10 SRational

Příklad

Následující příklad kódu přečte a zobrazí sedm částí metadat v souboru FakePhoto.jpg. Druhá položka vlastnosti (index 1) v seznamu má Id 0x010F (výrobce vybavení) a Type 2 (pole BAJTŮ kódované ASCII). V příkladu kódu se zobrazí hodnota této položky vlastnosti.

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

Kód vytvoří výstup podobný následujícímu:

 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.

Probíhá kompilace kódu

Předchozí příklad je určen pro použití s model Windows Forms a vyžaduje PaintEventArgs e, což je parametr Paint obslužné rutiny události. Zpracujte událost formuláře Paint a vložte tento kód do obslužné rutiny události malování. Je nutné nahradit FakePhoto.jpg názvem image a cestou platnou System.Drawing.Imaging v systému a importovat obor názvů.

Viz také