本主題介紹 Windows 映射元件 (WIC) 所提供的映射元數據支援。 它提供讀取和寫入影像元數據、元數據查詢語言和元數據處理程式擴充性的簡介。
影像元數據是內嵌在影像檔案內的數據,可提供影像的其他資訊,例如用來擷取影像或影像維度的裝置。 雖然它包含在圖像檔本身內,但此元數據不是轉譯數據的一部分。 WIC 提供介面,可讓您讀取和寫入數種常見元數據格式的元數據,包括可延伸元數據平臺 (XMP)、可交換圖像檔案 (EXIF)和 Png 文字數據 (tEXt)。
本主題包含下列各節。
先決條件
若要瞭解本主題,您應該熟悉 WIC 編碼器和譯碼器介面及其相關的元件物件模型 (COM) 元件,如 Windows 映射元件概觀中所述。 它也有助於普遍熟悉目前使用的一些影像元數據格式。
介紹
元數據提供影像的擴充資訊。 這項資訊可以透過數種方式使用。 影像可能包含描述、評等、類別標籤和著作權資訊的元數據。 存取元數據可讓您更輕鬆地執行資產管理、檔案位置或判斷著作權資訊等工作。 例如,Windows Vista 中的 Windows 相片庫可讓您將描述和類別標籤新增至影像。 這可讓您更清楚地探索影像,以及分類影像的便利方式。 使用 WIC API 和一般元數據格式,應用程式可以輕鬆地在影像中寫入或讀取這種類型的元數據。
下圖展示 JPEG 檔案的內容,其中包含嵌入的元數據區塊和元數據項目。
具有評等元數據的 jpeg 影像
在此範例影像中,元數據會內嵌在影像框架內的圖像檔案中。 JPEG 格式不支援多個影像幀,因此元數據在概念上附屬於這個單一畫面。 支援多個框架的格式,例如 TIFF,可能會有元數據附加至每個影像框架,如下圖所示。 雖然目前並不常見,而且原生影像編解碼器不支援,但某些影像格式可能也支援影像框架外的元數據。 WIC 具有足夠的彈性,可同時處理影像個別框架外部的畫面層級元數據和元數據。
讀取影像元數據
WIC API 提供 COM元件,可讓應用程式輕鬆讀取和寫入映射元數據。
讀取元數據的主要方式是使用元數據查詢讀取器 (IWICMetadataQueryReader) 來存取特定元數據專案。 元數據查詢讀取器元件是由編解碼器實作,而且可以在譯碼器層級或透過個別影像畫面格來存取,這是較常見的方法。 下列程式代碼示範如何使用查詢讀取器的 getMetadataQueryReader GetMetadataQueryReader 方法來存取個別框架的查詢讀取器。
// Get the query reader
if (SUCCEEDED(hr))
{
hr = pFrameDecode->GetMetadataQueryReader(&pQueryReader);
}
查詢器提供用來取得特定元數據資訊的方法,並且提供指定要擷取的元數據項目之方式。 下列程式代碼會使用查詢表達式來請求App1嵌套圖像文件目錄(IFD)區塊內的特定元資料項目。 這是使用查詢讀取器的 GetMetadataByName 方法來完成。 下列程式代碼示範如何使用查詢讀取器來取得 MicrosoftPhoto 評等值。
PROPVARIANT value;
PropVariantInit(&value);
LPCWSTR pwzRatingQuery = L"/app1/ifd/{ushort=18249}";
if (SUCCEEDED(hr))
{
hr = pQueryReader->GetMetadataByName(pwzRatingQuery, &value);
}
上述範例中的 pwzRatingQuery 變數是用來存取元數據專案 MicrosoftPhoto 評等的查詢字串。 此字串是使用元數據查詢語言所建立。 若要建立此字串,需具備中繼資料格式和中繼資料查詢語言的知識,以便擷取各個中繼資料項目。 如需元資料查詢語言的詳細資訊,請參閱 元數據查詢語言概觀。
在幕後,查詢讀取器會使用元數據讀取器(IWICMetadataReader)來存取查詢表達式所描述的元數據。 除了使用查詢讀取器,您也可以直接存取元數據讀取器來讀取元數據。 您可以從譯碼器或個別框架取得元數據讀取器,方法是查詢區塊讀取器 (IWICMetadataBlockReader) 介面。
寫入影像元數據
寫入元數據的程式與讀取方式類似,不同之處在於會使用元數據查詢寫入器(IWICMetadataQueryWriter)。 查詢寫入器介面是由影像編碼器實作,而且,如同在查詢讀取器中,元數據會在編碼器和個別畫面格上存取(視影像格式支援而定)。
下列程式碼示範如何從編碼器框架取得查詢撰寫器,並移除早先讀取的評分值。
// Get the frame's query writer
if (SUCCEEDED(hr))
{
hr = pFrameEncode->GetMetadataQueryWriter(&pFrameQWriter);
}
if (SUCCEEDED(hr))
{
hr = pFrameQWriter->RemoveMetadataByName(L"/app1/ifd/{ushort=18249}");
}
另一種寫入元數據的方式是透過快速元數據更新。 快速元數據編碼是撰寫影像元數據的方法,而不需要重新編碼影像檔案。 這可藉由將新的元數據資訊寫入元數據格式的填補區域來完成。 快速元數據編碼器(IWICFastMetadataEncoder)是根據影像解碼器從元件工廠取得。 接著,快速的元數據編碼器會取得用於寫入元數據的資料輸入器。 最後,快速編碼器會認可變更。
下列程式代碼示範如何取得快速元數據編碼器,並用它來撰寫 MicrosoftRating 值。
if (SUCCEEDED(hr))
{
IWICFastMetadataEncoder *pFME = NULL;
IWICMetadataQueryWriter *pFMEQW = NULL;
hr = pFactory->CreateFastMetadataEncoderFromFrameDecode(
pFrameDecode,
&pFME);
if (SUCCEEDED(hr))
{
hr = pFME->GetMetadataQueryWriter(&pFMEQW);
}
if (SUCCEEDED(hr))
{
// Add additional metadata
PROPVARIANT value;
PropVariantInit(&value);
value.vt = VT_UI4;
value.uiVal = 99;
hr = pFMEQW->SetMetadataByName(L"/app1/ifd/{ushort=18249}", &value);
PropVariantClear(&value);
}
if (SUCCEEDED(hr))
{
hr = pFME->Commit();
}
}
並非所有元數據格式都支援快速元數據。 若要查看哪些原生支援的格式支援快速元數據編碼,請參閱本檔稍後 支援的元數據格式 一節中的表格。
在幕後,查詢寫入器會使用元數據寫入器(IWICMetadataWriter)來撰寫查詢表達式所描述的元數據。 除了使用查詢讀取器,您也可以直接存取元數據寫入器來寫入元數據。 您可以透過查詢區塊寫入器介面(IWICMetadataBlockWriter),從解碼器或單獨幀中獲得元數據寫入器。
元數據擴充性
如先前所述,WIC 提供數個元數據處理程式來讀取和寫入常見元數據格式的元數據。 不過,有一些原生不支援的元數據格式。 因此,WIC 會提供 API 來建立其他元數據處理程式,以將元數據支援延伸至其他格式。
若要完全支援其他元數據格式,必須開發兩種類型的處理程式:讀取元數據的元數據讀取器,以及寫入元數據的元數據寫入器。 雖然這兩個處理程式通常會以特定格式的配對實作,但這不是必要條件。 在某些情況下,可能只需要讀取能力或只需要寫入能力。
如需使用 WIC API 之元數據擴充性的詳細資訊,請參閱 元數據擴充性概觀。
支援的元數據格式
WIC 提供數種常見元數據格式的支援。 下表列出支援的元數據格式、其版本、支援元數據格式的影像格式,以及元數據格式是否支援快速元數據編碼。 如需快速元數據編碼的詳細資訊,請參閱本檔稍早 撰寫影像元數據 一節。
支援的元數據格式 | 元數據規格版本 | 影像格式支援 | 支援快速元數據編碼 |
---|---|---|---|
App0 | JFIF 1.02 | JPEG | 不 |
App1 | JFIF 1.02 | JPEG、TIFF | 不 |
App13 | 未知 | JPEG、TIFF | 不 |
IFD | TIFF 6.0 | JPEG、TIFF | 是的 |
機構審查委員會 (IRB) | 未知 | JPEG、TIFF | 不 |
Exif | Exif 2.2 | JPEG、TIFF | 是的 |
XMP | XMP 1.0 (2005 年 9 月) | JPEG、TIFF | 是的 |
GPS | Exif 2.2 | JPEG、TIFF | 是的 |
IPTC | IPTC 4.0 | JPEG、TIFF | 是的 |
發簡訊 | PNG 1.2 | PNG | 不 |
注意
IPTC 只有在區塊大小增加時才支援 FME,因為 IPTC 不支援填補。
元數據元件摘要
下表描述支援元數據的 WIC 介面及其對應的元件。 這些元件提供影像元數據的存取權。 如需這些元件的詳細資訊,請參閱 Windows 映像處理元件概觀。
元件 | 描述 |
---|---|
點陣圖譯碼器 (IWICBitmapDecoder) |
|
點陣圖框架譯碼 (IWICBitmapFrameDecode) |
|
點陣圖編碼器 (IWICBitmapEncoder) |
|
Bitma 框架編碼 (IWICBitmapFrameEncode) |
|
下表描述 WIC 元數據元件。 這些元件可讓您讀取和寫入上表所列元件所公開映像中的元數據。
元件 | 描述 |
---|---|
中繼資料查詢讀取器 (IWICMetadataQueryReader) |
|
中繼資料查詢寫入器 (IWICMetadataQueryWriter) |
|
元數據區塊讀取器 (IWICMetadataBlockReader) |
|
元數據區塊寫入器 (IWICMetadataBlockWriter) |
|
元數據讀取器 (IWICMetadataReader) |
|
中繼資料寫入器 (IWICMetadataWriter) |
|
快速元數據編碼器IWICFastMetadataEncoder |
|
相關主題