共用方式為


元數據查詢語言概觀

本主題介紹 Windows 映射元件 (WIC) 的元數據查詢語言。 您可以使用元數據查詢語言來建立表達式,以在影像的元數據內尋找特定數據(元數據專案)和位置(元數據區塊)。

本主題包含下列各節。

先決條件

若要瞭解本主題,您應該熟悉 "WIC 元數據系統",這是在 WIC 元數據概觀 以及如何存取元數據,如 讀取和寫入影像元數據概觀中所述。

介紹

您主要透過兩個元件物件模型 (COM) 元件與元數據平臺互動:查詢讀取器,由 IWICMetadataQueryReader 介面,以及由 IWICMetadataQueryWriter 介面表示的查詢寫入器。 這些元件可讓您使用元數據查詢語言來讀取或寫入元數據。 查詢語言描述路徑表達式的語法,而查詢元件會使用此路徑表達式來存取所需的元數據。 此路徑表達式描述元數據區塊或專案的位置。

元數據區塊是特定格式的具名元數據群組。 元數據區塊可以包含個別的元數據項目,例如作者或建立時間,還可以包含額外的元數據區塊。 元數據區塊的名稱取決於其格式。 例如,包含App1元數據的元數據區塊會命名為 「app1」。。 常見的元數據格式包括 App1、Exif、IFD 和 XMP。

中繼資料項目是描述特性(如作者、標題和評分)的名稱/數值對。

路徑表達式包含一或多個元數據區塊名稱。 它也可以指定元數據區塊內的元數據項目。 下列路徑表達式代表App1區塊,其中包含包含元數據專案的IFD區塊:

  • /app1/ifd/{ushort=18249}

下圖說明具有四個根元數據區塊的 JPEG 影像範例組成:App0、App1、XMP 和未知區塊。 每個標示的項目都會記下中繼資料的類型(區塊或項目),以及用來擷取資料的查詢運算式。

jpeg 圖像附有元數據標註

注意

本文件會參考此圖表的內容,並用於許多範例中。

 

路徑表達式的結構

若要使用 WIC API 存取元數據,大部分情況下都必須使用完整查詢表達式。 本主題討論存取元數據的完整表達式。 如果您需要使用非完整表達式之案例的相關信息,請參閱本檔稍後的相片元數據原則表達式一節。

什麼是完全限定的查詢表達式? 在 WIC 中,完整表示式是以路徑字元斜線 (/) 開頭的字串,後面接著元數據區塊或特定元數據項目的導覽路徑。 導覽路徑中的每個步驟都會以斜線分隔,形成表達式來存取元數據區塊或元數據專案。 例如,以下是完整查詢表達式,可存取位於App1區塊中巢狀的IFD區塊中的Microsoft相片評等:

  • /app1/ifd/{ushort=18249}

當 WIC 剖析此表示式時,它會先搜尋影像元數據內的 App1 元數據區塊。 如果找到 App1 區塊,它會繼續搜尋尋找巢狀 IFD 元數據區塊。 如果找到 IFD 區塊,則會在 IFD 元數據區塊內尋找特定的元數據專案,此案例中是尋找標記 18249 下的 MicrosoftPhoto 評分。 如果任何時間 WIC 找不到元數據區塊或專案,則會中止查詢。

區塊選取

最簡單的 WIC 元數據查詢表示式是取得特定元數據區塊之查詢讀取器/寫入器的運算式。 取得查詢讀取器/寫入器可讓您直接將後續查詢導向巢狀元數據區塊,而不需處理其父區塊。 區塊選取查詢表達式是所需元數據區塊的瀏覽路徑。 例如,在上圖中,有五個元數據區塊,其中兩個是巢狀在其他元數據區塊中。 以下是 JPEG 範例中每個元資料區塊的路徑表示式:

  • /app0
  • /app1
  • /app1/ifd
  • /app1/ifd/exif
  • /xmp

當您使用查詢讀取器/寫入器執行查詢時,它會傳回新的查詢讀取器/寫入器,以在指定元數據區塊的範圍內服務查詢。 例如,如果您執行查詢 「/app1」,則會取得新的查詢讀取器,而新讀取器的查詢會相對於 App1 區塊。 這表示查詢 「/ifd」 對新的讀取器有效,因為 App1 區塊包含 IFD 區塊。 不過,“/xmp” 無法運作,因為此 App1 區塊不包含 XMP 元數據區塊。

查詢語言也支援索引表示法。 索引表示法可在相同類型的多個區塊存在時,提供特定元數據區塊的存取權。 針對 JPEG 範例,可以使用下列索引路徑表示式:

  • /[0]app1/[0]ifd

在查詢語言中,所有索引都從零開始。 在前述的表達式中,第一個零查詢的是第一個 App1 區塊,而第二個零查詢的是第一個巢狀 IFD 區塊。 即使相同類型的多個區塊不存在,仍可使用索引表示法。 如果範例 JPEG 包含內嵌 IFD 區塊的第二個 App1 區塊,則會使用運算式 “/[1]app1/ifd” 來存取第二個 App1 區塊。

處理 PNG tEXt 區塊時,索引表示法會變得更加常見,因為 PNG 映像可能會有一個以上的 tEXt 區塊。

注意

不支援多維度陣列索引。

 

項目選取

您可以藉由建置區塊選取表達式,來存取元數據區塊中的元數據專案。 請考慮 JPEG 範例中的 XMP 和 Microsoft Photo rating 屬性。 此元數據存在於兩個元數據區塊中:App1/IFD 和 XMP 區塊。 因此,可以使用多個運算式來存取相同的數據。 下列表示式會存取 XMP 區塊中的 MicrosoftPhoto 評等:

  • /xmp/xmp:評分

表達式中「xmp:」部分是架構相容的識別碼。 XMP 是可延伸的標準,可讓第三方單位發佈自己的架構,以定義如何儲存特定元數據項目。 XMP 架構是由 URL 完整識別,但 WIC 會為已知架構提供一組易記識別碼。 如需詳細資訊,請參閱 原生影像格式元數據查詢 主題。

若為 JPEG 影像,評等資訊也可以儲存在 App1 巢狀 IFD 區塊內。 不過,不同於 XMP 評等範例,IFD 區塊不會使用架構名稱來存取評等資訊。 您改用數據表達式。 下列表達式可用來存取 App1 巢狀 IFD 區塊中的 MicrosoftPhoto 評等:

  • /app1/ifd/{ushort=18249}

在此表達式中,表達式的 「/app1/ifd」 部分是 IFD 區塊的瀏覽路徑(如先前在區塊選取一節中所討論)。 表達式 “/{ushort=18249}” 的第二個部分會存取數據。 表達式的這個部分會指示查詢剖析器尋找嵌入在標識符為 18249 的無符號短標籤中的數據。

注意

如需每個影像格式所支援的常見元數據格式清單,請參閱 原生影像格式元數據查詢 主題。

 

{ushort=18249} 是數據表達式,而且可以採用數種形式。 數據表達式是包含要求的元數據標記或索引鍵的兩部分表達式,在此案例中為 “18249”,而索引鍵的數據類型則在此案例中為 “ushort”。 這兩個部分會以等號 (=) 分隔。 WICsupports 大多數常見的 C/C++數據類型。 查詢語言接受下列資料類型:

  • 字元
  • uchar
  • ushort
  • ulong
  • 整數
  • uint(無符號整數)
  • longlong
  • 漂浮
  • str
  • wstr
  • guid
  • 布林

注意

此清單只會指定元數據查詢語言支援的數據類型。 建立元數據查詢數據表達式時,請使用這些數據類型,例如 {ushort=18249}。 WIC 會以 PROPVARIANT 的形式傳回中繼資料項的值,該格式定義了自己的類型系統。

 

範例中的 「18249」 是數據標記。 這個特定數字是由 Microsoft 定義為包含 MicrosoftPhoto 評等。 數據標記可以是任何數位、字串或 GUID,視您要尋找的數據項而定

不同於 XMP 評等範例,App1/IFD 區塊中的評等值沒有名稱衝突。 這是因為 XMP 評等值實際上儲存在不同的 ushort 標籤 18246 下。 因此,存取 App1/IFD 區塊中 XMP 評等的運算式為:

  • /app1/ifd/{ushort=18246}

注意

如需元數據查詢語言的正式描述,請參閱本檔稍後的元數據查詢語言摘要一節。

 

轉義字符

查詢語言不區分大小寫,並將所有字元視為小寫。 不過,某些元數據格式(例如 XMP)會區分大小寫。 使用區分大小寫的元數據格式時,當您想要指定大寫字元時,請使用反斜杠 (\) 字元。

逸出字元會被語言解析器取用,後面的字元會直接解譯。 例如,表達式 {char=\\} 會解析為 '\',而 {char=\C} 會解析為大寫 C。如果沒有逸出字元,{char=\} 會是無效的表達式,{char=C} 會解譯為小寫 c。 請務必在區分大小寫的元數據格式中,為所有大寫字母之前加上反斜杠轉義字元。

範例表達式

下表提供查詢語言剖析器解譯的一些範例表達式和描述。

表達 描述
ifd/xmp/exif:作者 對應至下列導覽路徑:IFD 區塊 -> XMP 區塊 -> “Author” 屬性在 “Exif” 架構中。
/[1]ifd/[0]xmp/exif:Author 與此表格中的第一個項目相同,不同之處在於 [#] 前置詞用於描述在名稱衝突時要導航的項目。
/ifd/{ushort=700}/作者 與這個數據表中的第一個專案相同,不同之處在於它會使用數據表達式來參考 XMP 區塊,而不是區塊名稱 「xmp」 (XMP 區塊內嵌在未簽署的簡短標記識別碼 700 下)。 此外,“Author” 屬性不會指定架構。 查詢剖析器將嘗試在所有模式中比對屬性,並返回第一個相符項目。
/ifd/xmp 提供導覽路徑到一個元數據區塊。 如果找到區塊,則會傳回新的元數據讀取器/寫入器。
/[*]tEXt/關鍵詞 取得或設定 PNG 區塊的 Keyword 屬性。 因為 PNG 元數據規格允許特定類型的多個區塊,因此 [*] 表示法會取得/設定具有適當屬性的數據 PNG 區塊。 根據 PNG 規格,沒有兩個區塊可以有相同的屬性。

 

每個元數據區塊也會由元數據 GUID 唯一識別,可以用來取代易記的區塊名稱。 下列語法可用來取代提供區塊名稱:“/{guid=GUID}/[n]{guid=GUID}/schema:tagidentifier”

下表提供一些無效的範例,以及拒絕的原因。

無效的表達式 拒絕的描述
/ifd/[0][2]exif/ 拒絕,因為不支援多維度陣列索引。
/ifd/{ushort=1}/{ushort=2} 除非 IFD 具有 tagID=1,而且該元數據處理程式中包含具有 tagID=2 的元數據項目,否則將被拒絕。
/{ushort=1} 如果查詢處理涉及到元數據階層的最高層級,則拒絕。 這是因為最上層只包含元數據區塊,而不是數據項。

 

相片元數據原則表達式

如先前所述,完整查詢表達式會以斜線 (/) 開頭。 不以斜線開頭的表達式會評估為原則表達式。 原則表達式可讓您查詢影像相關 Windows 殼層屬性的相片元數據。 在本檔稍早的 [數據選取] 區段中,使用表達式 “/xmp/xmp:Rating” 來存取 XMP 評等屬性。 您也可以使用下列原則表示式來查詢此屬性:

  • System.簡易評分

若要從 MicrosoftPhoto 架構存取 rating 屬性,可以使用下列查詢表達式:

  • System.Rating

相片元數據政策表達的行為與完整的元數據查詢不同,在幾個顯著的方面表現出差异。

首先,使用原則表達式存取元數據時,WIC 會在多個元數據區塊中使用相同的屬性時,執行仲裁和衝突解決。 例如,MicrosoftPhoto 和 XMP 評等值都會儲存在 App1/IFD 區塊和 XMP 區塊中。 相片元數據原則會決定讀取元數據時傳回區塊值的優先順序。 當您撰寫元數據時,相片元數據原則可確保不同區塊中的相同屬性一致。 如果您使用元數據查詢,例如 「/xmp/xmp:Rating」,您必須負責在各種元數據位置之間進行仲裁。

注意

如需支持的原則表達式及其對應原則的清單,請參閱 相片元數據原則 主題。

 

其次,相片元數據原則表達式與影像格式無關,而完整元數據查詢則不是。 例如,“/xmp/xmp:Rating” 查詢是 JPEG 格式特有的。 TIFF 影像也支援 XMP 元數據,但與 JPEG 不同,因此 TIFF 查詢會是 “/ifd/xmp/xmp:Rating”。 不過,在這兩種情況下,原則表達式都會是 “System.SimpleRating”。

相較於完整元數據查詢,相片元數據原則表達式提供較高層級的抽象和簡單性,因此在不需要低階元數據存取的情況下,應該優先使用。 不過,原則表達式只能存取一組有限的影像元數據,而元數據查詢語言則提供幾乎儲存在圖像檔內之所有元數據的存取權。

元數據查詢語言摘要

下表是 WIC 元數據查詢語言的正式定義。 每個文法符號都代表由其他符號組成的表達式。 表達式可以是另一個符號或以垂直線分隔的其他符號序列(|),表示“或” 選擇。 右邊的整個表達式是左邊指定符號的可能替代項目。

象徵 表達
<路徑> <名稱> |'/' <屬性路徑>
<屬性路徑> <元數據專案> |<屬性路徑> '/' <屬性路徑>
<元數據專案> <索引名稱> |<項目名稱> |<架構名稱> ':' <項目名稱>
<架構名稱> <項目名稱>
<項目名稱> <元數據專案> | <索引專案><索引>
<索引專案> <項目> |<隱含元數據><項目>
<隱含元數據> '<'<name>'>'
<項目> <名稱> |<索引><數據> |<數據>
<數據> '{' <數據類型> '=' <值> '}'
<index> '[' <數字> | <星> ']'
<數據類型> 'char' |'uchar' |'short' |'ushort' |'long' |'ulong' |'int' |'uint' |'longlong' |'ulonglong' |'float' |'double' |'str' |'wstr' |'guid' |'bool'
<數據值> <號碼> | <名稱> | <guid>
<星> '*'
<號碼> 數字
<名稱> 字串
<guid> 全球唯一識別碼 (GUID)

 

概念

Windows 映射元件概觀

WIC 元數據概觀

讀取和寫入影像元數據的概觀

元數據擴充性概觀

操作指南:使用元數據重新編碼 JPEG 圖像