共用方式為


如何:讀取影像中繼資料

某些影像檔包含可讀取以判斷影像特徵的中繼資料。 例如,數位相片可能包含可讀取以判斷用於擷取影像之相機廠牌與型號的中繼資料。 使用 GDI+,您可以讀取現有的中繼資料,也可以將新的中繼資料寫入影像檔。

GDI+ 會將個別的中繼資料片段儲存在 PropertyItem 物件中。 您可以讀取 Image 物件的 PropertyItems 屬性,以從檔案擷取所有中繼資料。 PropertyItems 屬性會傳回 PropertyItem 物件的陣列。

PropertyItem 物件具有下列四個屬性:IdValueLenType

Id

識別中繼資料項目的標籤。 下表顯示一些可指派給 Id 的值:

十六進位值 描述
0x0320

0x010F

0x0110

0x9003

0x829A

0x5090

0x5091
影像標題

設備製造商

設備型號

ExifDTOriginal

Exif 快門速度

亮度表

色度表

值的陣列。 值的格式由 Type 屬性來決定。

Len

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

類型

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 編碼的位元組陣列)。 此程式碼範例顯示該屬性項目的值。

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

程式碼會產生類似下列的輸出:

 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.

編譯程式碼

上述範例是為了搭配 Windows Forms 使用而設計,且其需要 PaintEventArgse,這是 Paint 事件處理常式的參數。 處理表單的 Paint 事件,並將此程式碼貼到繪製事件處理常式中。 您必須以系統上有效的影像名稱和路徑取代 FakePhoto.jpg,並匯入 System.Drawing.Imaging 命名空間。

另請參閱