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
, Len
a 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é
.NET Desktop feedback