共用方式為


HOW TO:讀取影像中繼資料

更新:2007 年 11 月

有些影像檔案中會包含中繼資料 (Metadata),您可以讀取這項資料來判斷影像的特性。例如,讀取數位相片中所包含的中繼資料,可以判斷出捕捉影像時所使用的相機品牌和型號。在 GDI+ 中,可以讀取現有的中繼資料,也可以將新的中繼資料寫入影像檔案中。

GDI+ 會將各筆中繼資料儲存在 PropertyItem 物件中。您可以讀取 Image 物件的 PropertyItems 屬性來擷取檔案中的所有中繼資料。PropertyItems 屬性會傳回 PropertyItem 物件的陣列。

PropertyItem 物件具有下列四個屬性:Id、Value、Len 和 Type。

Id

識別中繼資料項目的標記 (Tag)。部分可指派給 Id 的值列在下表中。

十六進位值

描述

0x0320

0x010F

0x0110

0x9003

0x829A

0x5090

0x5091

影像標題

設備製造商

設備型號

ExifDTOriginal

Exif 曝光時間

亮度表

色度表

Value

值的陣列。值的格式是由 Type 屬性判斷。

Len

Value 屬性所指向之值的陣列的長度 (以位元組為單位)。

Type

Value 屬性所指向之陣列中值的資料型別。Type 屬性值所表示的格式列在下表中。

數值

說明

1

Byte

2

以 ASCII 編碼之 Byte 物件的陣列

3

16 位元整數

4

32 位元整數

5

代表有理數之兩個 Byte 物件的陣列

6

未使用

7

未定義

8

未使用

9

SLong

10

SRational

範例

說明

下列程式碼範例會讀取並顯示 FakePhoto.jpg 檔案中的七筆中繼資料。清單中第二個 (索引為 1) 屬性項目的 Id 為 0x010F (設備製造商),Type 為 2 (以 ASCII 編碼的位元組陣列)。這個程式碼範例將顯示該屬性項目的值。

這個程式碼所產生的輸出與下列類似:

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.

程式碼

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

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

編譯程式碼

上述範例是專為與 Windows Form 搭配使用而設計的,而且它需要 PaintEventArgs e (即 Paint 事件處理常式的參數)。請以系統中有效的影像名稱和路徑來取代 FakePhoto.jpg。

請參閱

其他資源

影像、點陣圖和中繼檔

使用影像、點陣圖、圖示和中繼檔