Instrukcje: Odczytywanie metadanych obrazu

Niektóre pliki obrazów zawierają metadane, które można odczytać, aby określić cechy obrazu. Na przykład zdjęcie cyfrowe może zawierać metadane, które można odczytać w celu określenia marki i modelu aparatu użytego do przechwycenia obrazu. Dzięki GDI+ można odczytywać istniejące metadane, a także zapisywać nowe metadane do plików obrazów.

GDI+ przechowuje pojedynczy element metadanych w obiekciePropertyItem. Możesz odczytać właściwość PropertyItems obiektu , Image aby pobrać wszystkie metadane z pliku. Właściwość PropertyItems zwraca tablicę PropertyItem obiektów .

Obiekt PropertyItem ma następujące cztery właściwości: Id, Value, Leni Type.

Id

Tag, który identyfikuje element metadanych. Niektóre wartości, do których można przypisać, Id przedstawiono w poniższej tabeli:

Wartość szesnastkowa Opis
0x0320

0x010F

0x0110

0x9003

0x829A

0x5090

0x5091
Tytuł obrazu

Producent sprzętu

Model sprzętu

ExifDTOriginal

Exif exposure time (Czas narażenia na ryzyko)

Tabela z jasnością

Tabela Zamieciowa

Wartość

Tablica wartości. Format wartości jest określany przez właściwość Type .

Len

Długość (w bajtach) tablicy wartości wskazywanych przez właściwość Value .

Typ

Typ danych wartości w tablicy wskazywany przez właściwość Value . Formaty wskazywane przez Type wartości właściwości przedstawiono w poniższej tabeli:

Wartość liczbowa Opis
1 Polecenie Byte
2 Tablica obiektów Byte zakodowanych jako ASCII
3 16-bitowa liczba całkowita
4 32-bitowa liczba całkowita
5 Tablica dwóch obiektów Byte , które reprezentują racjonalną liczbę
6 Nieużywane
7 Niezdefiniowane
8 Nieużywane
9 SLong
10 SRational

Przykład

Poniższy przykład kodu odczytuje i wyświetla siedem fragmentów metadanych w pliku FakePhoto.jpg. Drugi element właściwości (indeks 1) Id na liście ma wartość 0x010F (producent sprzętu) Type i 2 (tablica bajtów zakodowana w formacie ASCII). Przykładowy kod wyświetla wartość tego elementu właściwości.

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

Kod generuje dane wyjściowe podobne do następujących:

 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.

Kompilowanie kodu

Poprzedni przykład został zaprojektowany do użycia z Windows Forms i PaintEventArgsewymaga parametru , który jest parametrem procedury obsługi Paint zdarzeń. Obsługa zdarzenia formularza i Paint wklej ten kod do procedury obsługi zdarzeń malowania. Należy zastąpić nazwą FakePhoto.jpg obrazu i ścieżką prawidłową w systemie i zaimportować przestrzeń System.Drawing.Imaging nazw.

Zobacz też