共用方式為


WIC 元數據概觀

本主題介紹 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
  • 讀取影像數據流併產生可使用的點陣圖來源。 與容器格式相關聯,例如標記圖像檔格式(TIFF)或聯合攝影專家組(JPEG)。
  • 實作 IWICMetadataBlockReader 介面,以列舉譯碼器數據流中不在框架內的所有元數據區塊。
  • 提供一個查詢閱讀器,用於讀取與未置於框架內的圖片相關聯的元數據。
點陣圖框架譯碼 (IWICBitmapFrameDecode
  • 從譯碼器持有的影像數據流存取個別畫面格。
  • 實作 IWICMetadataBlockReader 介面,以列舉框架數據流中的所有元數據區塊。
  • 公開查詢讀取器,以使用查詢表達式讀取與框架相關聯的元數據。
點陣圖編碼器 (IWICBitmapEncoder
  • 將點陣圖來源寫入影像數據流。 與 TIFF 或 JPEG 等容器格式相關聯。
  • 實作 IWICMetadataBlockWriter 介面,以建置元數據區塊清單,以寫入編碼器的數據流。
  • 提供一個查詢寫入器,以使用查詢表達式寫入與圖像相關的元數據。
Bitma 框架編碼 (IWICBitmapFrameEncode
  • 建立一個框架,將編碼為編碼器所持有的數據流。
  • 實作 IWICMetadataBlockWriter 介面,以建置要寫入框架數據流的元數據區塊清單。
  • 為查詢撰寫器提供使用查詢表達式撰寫與框架相關聯的元數據的能力。

 

下表描述 WIC 元數據元件。 這些元件可讓您讀取和寫入上表所列元件所公開映像中的元數據。

元件 描述
中繼資料查詢讀取器 (IWICMetadataQueryReader
  • 取得查詢字串,並巡覽基礎元數據階層以取得元數據。
中繼資料查詢寫入器 (IWICMetadataQueryWriter
  • 取得查詢字串,並巡覽基礎元數據階層以取得、設定和移除元數據。
元數據區塊讀取器 (IWICMetadataBlockReader
  • 管理 IWICMetadataReader 的唯讀集合, 元數據階層頂端的物件,並啟用所有元數據區塊的列舉。
  • 由位圖譯碼器和已譯碼的點陣圖框架實作。
  • 由第三方元件開發人員針對自定義編解碼器實作。
元數據區塊寫入器 (IWICMetadataBlockWriter
  • 管理元數據階層頂端 IWICMetadataWriter 物件的讀取和寫入集合。
  • 由位圖編碼器和位圖框架編碼實現。
  • 由第三方元件開發人員針對自定義編解碼器實作。
元數據讀取器 (IWICMetadataReader
  • 剖析元數據資料流,並管理元數據項目的唯讀集合。 與 EXIF、IFD 和 XMP 等元數據格式相關聯。
  • 做為字典,在指定格式和標識符組時傳回值。
  • 由第三方元件開發人員針對自定義元數據類型實作。
中繼資料寫入器 (IWICMetadataWriter
  • 剖析和序列化元數據流,並管理元數據項目的讀取/寫入集合。
  • 由第三方元件開發人員針對自定義元數據類型實作。
快速元數據編碼器IWICFastMetadataEncoder
  • 提供在元數據階層上寫入的語意,該階層會即時更新元數據而不需重新編碼影像。

 

概念

Windows 映射元件概觀

元數據查詢語言概觀

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

元數據擴充性概觀

操作指南:透過元數據重新編碼 JPEG 影像