Porady: odczytywanie metadanych obrazu

Niektóre pliki obrazów zawierają metadane, które można odczytać, aby określić funkcje obrazu. Na przykład cyfrowe zdjęcie może zawierać metadane, które można odczytać w celu określenia makijażu i modelu aparatu używanego do przechwytywania obrazu. Za pomocą interfejsu GDI+można odczytywać istniejące metadane, a także zapisywać nowe metadane w plikach obrazów.

GDI+ przechowuje pojedynczy element metadanych w PropertyItem obiekcie. Właściwość obiektu można odczytać, PropertyItemsImage 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, , ValueLeni Type.

Id

Tag identyfikujący element metadanych. Niektóre wartości, które można przypisać do Id , są wyświetlane w poniższej tabeli:

Wartość szesnastkowa opis
0x0320

0x010F

0x0110

0x9003

0x829A

0x5090

0x5091
Tytuł obrazu

Producent sprzętu

Model sprzętu

ExifDTOriginal

Czas ekspozycji exif

Tabela Luminance

Tabela chrominance

Wartość

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

Len

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

Type

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

Wartość liczbowa opis
1 Polecenie Byte
2 Tablica Byte obiektów zakodowanych jako ASCII
3 16-bitowa liczba całkowita
4 32-bitowa liczba całkowita
5 Tablica dwóch Byte obiektów reprezentujących liczbę racjonalną
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) na liście ma Id 0x010F (producent sprzętu) i Type 2 (tablica bajtów zakodowana w formacie ASCII). W przykładzie kodu wyświetlana jest 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

Powyższy przykład jest przeznaczony do użycia z formularzami Windows Forms i wymaga PaintEventArgseparametru , który jest parametrem Paint programu obsługi zdarzeń. Obsłuż zdarzenie formularza Paint i wklej ten kod do procedury obsługi zdarzeń malowania. Musisz zastąpić FakePhoto.jpg nazwą obrazu i ścieżką prawidłową w systemie i zaimportować System.Drawing.Imaging przestrzeń nazw.

Zobacz też