WIC 中繼資料概觀

本主題介紹 Windows 映像元件 (WIC) 所提供的映射中繼資料支援。 它提供讀取和寫入影像中繼資料、中繼資料查詢語言和元資料處理程式擴充性的簡介。

影像中繼資料是內嵌在影像檔內的資料,可提供影像的其他資訊,例如用來擷取影像或影像維度的裝置。 雖然它包含在影像檔本身內,但此中繼資料不是轉譯資料的一部分。 WIC 提供介面,可讓您讀取和寫入數種常見元資料格式的中繼資料,包括可延伸中繼資料平臺 (XMP) 、Exchangeable Image File (EXIF) ,以及 Png Textual Data (tEXt) 。

本主題包含下列各節。

必要條件

若要瞭解本主題,您應該熟悉 WIC 編碼器和解碼器介面及其相關的元件物件模型 (COM) 元件,如 Windows 映像元件概觀中所述。 它也有助於熟悉目前使用的一些影像元資料格式。

簡介

中繼資料提供影像的擴充資訊。 這項資訊可以透過數種方式使用。 影像可能包含中繼資料,例如描述、評等、類別標籤和著作權資訊。 存取中繼資料可讓您更輕鬆地執行工作,例如資產管理、檔案位置或判斷著作權資訊。 例如,Windows Vista 中的 Windows 相片庫可讓您將描述和類別標籤新增至影像。 這可讓您更清楚地探索影像,以及分類影像的便利方式。 使用 WIC API 和常見的元資料格式,應用程式可以輕鬆地在影像中寫入或讀取這種類型的中繼資料。

下圖說明包含內嵌中繼資料區塊和中繼資料專案的 JPEG 檔案內容。

具有評等中繼資料的 jpeg 影像

在此範例影像中,中繼資料會內嵌在圖像框架內的影像檔案中。 JPEG 格式不支援多個影像框架,因此中繼資料在概念上會附加至這個單一框架。 支援多個畫面的格式,例如 TIFF,可能會有中繼資料附加至每個影像框架,如下圖所示。 雖然目前並不常見,但原生影像編解碼器不支援,但某些影像格式可能也支援影像框架外部的中繼資料。 WIC 具有足夠的彈性,可處理影像個別框架以外的畫面層級中繼資料和中繼資料。

讀取影像中繼資料

WIC API 提供 COM 元件,可讓應用程式輕鬆讀取和寫入映射中繼資料。

讀取中繼資料的主要方式是使用中繼資料查詢讀取器 (IWICMetadataQueryReader) 來存取特定的中繼資料專案。 中繼資料查詢讀取器元件是由編解碼器所實作,而且可以在解碼器層級或透過個別影像框架存取,這是較常見的方法。 下列程式碼示範如何使用查詢讀取器的 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 No
App1 JFIF 1.02 JPEG、TIFF No
App13 Unknown JPEG、TIFF No
IFD TIFF 6.0 JPEG、TIFF Yes
Irb Unknown JPEG、TIFF No
Exif Exif 2.2 JPEG、TIFF Yes
XMP XMP 1.0 (2005 年 9 月) JPEG、TIFF Yes
GPS Exif 2.2 JPEG、TIFF Yes
IPTC IPTC 4.0 JPEG、TIFF Yes
文本 PNG 1.2 PNG No

 

注意

IPTC 只有在區塊大小成長時才支援 FME,因為 IPTC 不支援填補。

 

中繼資料元件摘要

下表描述支援中繼資料及其對應元件的 WIC 介面。 這些元件提供影像中繼資料的存取權。 如需這些元件的詳細資訊,請參閱 Windows 映像處理元件概觀

元件 Description
點陣圖解碼器 (IWICBitmapDecoder)
  • 讀取影像資料流程,並產生可用的點陣圖來源。 與容器格式相關聯,例如標記影像檔案格式 (TIFF) 或聯合攝影專家群組 (JPEG) 。
  • 實作 IWICMetadataBlockReader 介面,以列舉解碼器資料流程中不在框架內的所有中繼資料區塊。
  • 公開查詢讀取器,以讀取與不在框架內之影像相關聯的中繼資料。
點陣圖框架解碼 (IWICBitmapFrameDecode)
  • 從解碼器所持有的影像資料流程存取個別畫面格。
  • 實作 IWICMetadataBlockReader 介面,以列舉框架資料流程中的所有中繼資料區塊。
  • 使用查詢運算式,公開查詢讀取器以讀取與框架相關聯的中繼資料。
點陣圖編碼器 (IWICBitmapEncoder)
  • 將點陣圖來源寫入影像資料流程。 與 TIFF 或 JPEG 等容器格式相關聯。
  • 實作 IWICMetadataBlockWriter 介面,以建置要寫入編碼器資料流程的中繼資料區塊清單。
  • 使用查詢運算式,公開查詢寫入器以寫入與影像相關聯的中繼資料。
Bitma Frame Encode (IWICBitmapFrameEncode)
  • 建立一個框架,該框架會編碼為編碼器所持有的資料流程。
  • 實作 IWICMetadataBlockWriter 介面,以建置要寫入框架資料流程的中繼資料區塊清單。
  • 使用查詢運算式,公開查詢寫入器以寫入與框架相關聯的中繼資料。

 

下表描述 WIC 中繼資料元件。 這些元件可讓您在上表所列元件所公開的映射中讀取和寫入中繼資料。

元件 Description
中繼資料查詢讀取器 (IWICMetadataQueryReader)
  • 取得查詢字串,並巡覽基礎中繼資料階層以取得中繼資料。
中繼資料查詢寫入器 (IWICMetadataQueryWriter)
  • 取得查詢字串,並巡覽基礎中繼資料階層以取得、設定和移除中繼資料。
中繼資料區塊讀取器 (IWICMetadataBlockReader)
  • 管理中繼資料階層頂端 IWICMetadataReader 物件的唯讀集合,並啟用所有中繼資料區塊的列舉。
  • 由點陣圖解碼器和解碼點陣圖框架實作。
  • 由協力廠商元件開發人員針對自訂編解碼器實作。
中繼資料區塊寫入器 (IWICMetadataBlockWriter)
  • 管理中繼資料階層頂端 IWICMetadataWriter 物件的讀取和寫入集合。
  • 由點陣圖編碼器和點陣圖框架編碼實作。
  • 由協力廠商元件開發人員針對自訂編解碼器實作。
中繼資料讀取器 (IWICMetadataReader)
  • 剖析中繼資料資料流程,並管理中繼資料專案的唯讀集合。 與 EXIF、IFD 和 XMP 等元資料格式相關聯。
  • 當做字典,當指定格式和識別碼組時,傳回值。
  • 由協力廠商元件開發人員針對自訂元資料類型實作。
中繼資料寫入器 (IWICMetadataWriter)
  • 剖析及序列化中繼資料資料流程,並管理中繼資料專案的讀取/寫入集合。
  • 由協力廠商元件開發人員針對自訂元資料類型實作。
快速中繼資料編碼器IWICFastMetadataEncoder
  • 公開在中繼資料階層上寫入的語意,以在未重新編碼影像的情況下就地更新中繼資料。

 

概念

Windows 映像處理元件概觀

中繼資料查詢語言概觀

讀取和寫入影像中繼資料的概觀

中繼資料擴充性概觀

作法:使用中繼資料重新編碼 JPEG 影像