共用方式為


元數據擴充性概觀

本主題介紹為 Windows 映像處理元件建立自定義元數據處理程式的需求,包括元數據讀取器和寫入器。 它也會討論擴充 WIC 執行階段元件探索以包含自訂中繼資料處理程式的需求。

本主題包含下列各節。

先決條件

若要瞭解本主題,您應該深入瞭解 WIC、其元件和影像的元數據。 如需 WIC 元資料的詳細資訊,請參閱 WIC 元資料概觀。 如需 WIC 元件的詳細資訊,請參閱 Windows 映像處理元件概觀

介紹

WIC 元數據概觀所述,影像中通常會有多個元數據區塊,每個區塊都會以不同的元數據格式公開不同類型的資訊。 若要與內嵌在影像中的元數據格式互動,應用程式必須使用適當的元數據處理程式。 WIC 提供數個元數據處理程式(元數據讀取器和寫入器),可讓您讀取和寫入特定類型的元數據,例如 Exif 或 XMP。

除了提供的原生處理程式之外,WIC 還提供 API,可讓您建立參與 WIC 運行時間元件探索的新元數據處理程式。 這可讓使用 WIC 的應用程式讀取和寫入您的自訂元數據格式。

下列步驟可讓您的元數據處理程式參與 WIC 的運行時間元數據探索。

  • 實作元數據讀取器處理程序類別 (IWICMetadataReader),公開讀取自定義元數據格式所需的 WIC 介面。 這可讓基於 WIC 的應用程式以讀取原生元數據格式的方式讀取您的元數據格式。
  • 實作元數據寫入器處理程序類別(IWICMetadataWriter),公開編碼自定義元數據格式所需的 WIC 介面。 這可讓 WIC 型應用程式將您的元數據格式串行化為支援的影像格式。
  • 以數位方式簽署並註冊您的元數據處理程式。 這可讓您在運行時間探索元數據處理程式,方法是比對登錄中的識別模式與內嵌在映像檔中的模式。

建立元數據讀取器

編解碼器內元數據區塊的主要存取權是透過每個 WIC 編解碼器實作的 IWICMetadataBlockReader 介面。 這個介面會列舉內嵌在影像格式中的每個元數據區塊,以便探索並具現化每個區塊的適當元數據處理程式。 WIC 無法辨識的元數據區塊會被視為未知,並定義為 GUID CLSID_WICUnknownMetadataReader。 若要讓 WIC 辨識您的元數據格式,您必須建立實作三個介面的類別:IWICMetadataReaderIWICPersistStream,以及 IWICStreamProvider

注意

如果您的元數據格式有一些限制會使某些必要介面的方法不適用,則這類方法應該返回 WINCODEC_ERR_UNSUPPORTEDOPERATION。

 

IWICMetadataReader 介面

建立元數據讀取器時,必須實作 IWICMetadataReader 介面。 這個介面可讓您存取元數據格式資料流中的基礎元數據項目。

下列程式代碼顯示元數據讀取器介面的定義,如 wincodecsdk.idl 檔案中所定義。

interface IWICMetadataReader : IUnknown
{
    HRESULT GetMetadataFormat(
        [out] GUID *pguidMetadataFormat
        );

    HRESULT GetMetadataHandlerInfo(
        [out] IWICMetadataHandlerInfo **ppIHandler
        );

    HRESULT GetCount(
        [out] UINT *pcCount
        );

    HRESULT GetValueByIndex(
        [in] UINT nIndex,
        [in, out, unique] PROPVARIANT *pvarSchema,
        [in, out, unique] PROPVARIANT *pvarId,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetEnumerator(
        [out] IWICEnumMetadataItem **ppIEnumMetadata
        );
};

GetMetadataFormat 方法會傳回您的元數據格式的 GUID。

GetMetadataHandlerInfo 方法會傳回 IWICMetadataHandlerInfo 介面,該介面提供有關元數據處理程式的相關資訊。 這包括哪些影像格式支援元數據格式,以及您的元數據讀取器是否需要存取完整元數據數據流等資訊。

GetCount 方法會傳回元數據數據流中找到的個別元數據項目數目(包括內嵌元數據區塊)。

GetValueByIndex 方法會根據索引值返回元資料項目。 此方法允許應用程式遍歷元數據區塊中的每個元數據專案。 下列程式碼展示如何用此方法取得元數據區塊中每個元數據項目。

PROPVARIANT readerValue;
IWICMetadataBlockReader *blockReader = NULL;
IWICMetadataReader *reader = NULL;

PropVariantInit(&readerValue);

hr = pFrameDecode->QueryInterface(IID_IWICMetadataBlockReader, (void**)&blockReader);

if (SUCCEEDED(hr))
{
    // Retrieve the third block in the image. This is image specific and
    // ideally you should call this by retrieving the reader count
    // first.
    hr = blockReader->GetReaderByIndex(2, &reader);
}

if (SUCCEEDED(hr))
{
    UINT numValues = 0;

    hr = reader->GetCount(&numValues);

    // Loop through each item and retrieve by index
    for (UINT i = 0; SUCCEEDED(hr) && i < numValues; i++)
    {
        PROPVARIANT id, value;

        PropVariantInit(&id);
        PropVariantInit(&value);

        hr = reader->GetValueByIndex(i, NULL, &id, &value);

        if (SUCCEEDED(hr))
        {
            // Do something with the metadata item.
            //...
        }
        PropVariantClear(&id);
        PropVariantClear(&value);
    }               
}

GetValue 方法會依架構和/或標識符擷取特定中繼資料項目。 這個方法類似於 getValueByIndex 方法,不同之處在於它會擷取具有特定架構或標識碼的元數據專案。

GetEnumerator 方法會傳回中繼資料區塊中每個中繼資料專案的列舉器。 這可讓應用程式使用列舉器來瀏覽您的元數據格式。

如果您的元資料格式沒有元資料項目的架構概念,GetValue...方法應該忽略這個屬性。 然而,如果您的格式支援架構命名,您應該預期會有NULL 值出現。

如果中繼資料項目是嵌入的中繼資料區塊,則從嵌入內容的子流建立中繼資料處理程式,並返回新的中繼資料處理程式。 如果巢狀區塊沒有可用的元數據讀取器,請具現化並傳回未知的元數據讀取器。 若要為內嵌區塊建立新的元數據讀取器,請呼叫元件處理站的 CreateMetadataReaderFromContainerCreateMetadataReader 方法,或呼叫 WICMatchMetadataContent 函式。

如果元數據數據流包含 big-endian 內容,元數據讀取器會負責交換它處理的任何數據值。 它也負責通知任何巢狀元數據讀取器,他們正在處理大端序數據流。 不過,所有值都應該以小端格式傳回。

透過支援查詢,其中元數據專案的標識碼為 VT_CLSID(GUID),並對應至某個元數據格式,來實現命名空間導航的支援。 如果在解析過程中識別出該格式的巢狀元數據讀取器,則必須將其傳回。 這可讓應用程式使用元數據查詢讀取器來搜尋您的元數據格式。

當透過 ID 獲取元數據項時,您應該使用 PropVariantChangeType 函式,將 ID 轉換為預期的類型。 例如,IFD 讀取器會將標識碼強制輸入 VT_UI2,以配合 IFD 標籤標識碼 USHORT 的數據類型。 輸入類型和預期類型都必須為 PROPVARIANT 才能執行這項工作。 這並非必要,但執行這項強制會簡化呼叫讀取器以查詢元數據項目的程序代碼。

IWICPersistStream 介面

IWICPersistStream 介面繼承自 IPersistStream,並提供使用 WICPersistOptions 列舉來儲存和載入物件的其他方法。

下列程式代碼顯示 IWICPersistStream 介面的定義,如 wincodecsdk.idl 檔案中所定義。

interface IWICPersistStream : IPersistStream
{
    HRESULT LoadEx(
        [in, unique] IStream *pIStream,
        [in, unique] const GUID *pguidPreferredVendor,
        [in] DWORD dwPersistOptions
        );

    HRESULT SaveEx(
        [in] IStream *pIStream,
        [in] DWORD dwPersistOptions,
        [in] BOOL fClearDirty
        );
};

LoadEx 方法會為您的元數據讀取器提供包含元數據區塊的數據流。 您的解析器會剖析此資料流,以存取底層元數據資料元件。 元數據讀取器會使用位於原始元數據內容開頭的子數據流來初始化。 如果您的讀取器不需要完整數據流,則子數據流的範圍僅限於元數據區塊的內容;否則,完整元數據數據流會提供元數據區塊開頭所設定的位置。

元數據寫入器會使用 SaveEx 方法來串行化您的元數據區塊。 在元數據讀取器中使用 SaveEx 時,它應該會傳回 WINCODEC_ERR_UNSUPPORTEDOPERATION。

IWICStreamProvider 介面

IWICStreamProvider 介面可讓您的元數據讀取器提供其內容數據流的參考、提供數據流的相關信息,以及重新整理數據流的快取版本。

下列程式代碼顯示 IWICStreamProvider 介面的定義,如 wincodecsdk.idl 檔案中所定義。

interface IWICStreamProvider : IUnknown
{
    HRESULT GetStream(
        [out] IStream **ppIStream
        );

    HRESULT GetPersistOptions(
        [out] DWORD *pdwPersistOptions
        );

    HRESULT GetPreferredVendorGUID(
        [out] GUID *pguidPreferredVendor
        );

    HRESULT RefreshStream(
        );
};

GetStream 方法會擷取您的中繼資料流的參考。 您傳回的數據流應該會將數據流指標重設為起始位置。 如果您的元數據格式需要完整數據流存取,則開始位置應該是元數據區塊的開頭。

GetPersistOptions 方法會從 WICPersistOptions 列舉傳回數據流目前的選項。

GetPreferredVendorGUID 方法會傳回元數據讀取器廠商的 GUID。

RefreshStream 方法會重新整理元數據數據流。 此方法必須以 NULL 數據流呼叫 LoadEx,針對任何巢狀元數據區塊。 這是必要的,因為巢狀中繼資料區塊及其項目可能因為就地編輯而不再存在。

建立元數據寫入器

元數據寫入器是一種元數據處理程式,提供將元數據區塊序列化進入影像框架的方式,或者在支援此功能的影像格式中,則可將其放置在個別框架之外。 編解碼器內元數據寫入器的主要存取權是透過每個 WIC 編碼器實作的 IWICMetadataBlockWriter 介面。 此介面可讓應用程式列舉影像中內嵌的每個元數據區塊,以便探索並具現化每個元數據區塊的適當元數據寫入器。 沒有對應元數據寫入器的元數據區塊會被視為未知,並定義為 GUID CLSID_WICUnknownMetadataReader。 若要讓啟用 WIC 的應用程式串行化和寫入元數據格式,您必須建立實作下列介面的類別:IWICMetadataWriterIWICMetadataReaderIWICPersistStream,以及 IWICStreamProvider

注意

如果您的元數據格式有導致某些必要介面的方法不適當的限制,則這類方法應該會回傳WINCODEC_ERR_UNSUPPORTEDOPERATION。

 

IWICMetadataWriter 介面

IWICMetadataWriter 介面必須由你的元數據寫入器實作。 此外,由於 IWICMetadataWriter 繼承自 IWICMetadataReader,因此您也必須實作 IWICMetadataReader的所有方法。 因為這兩個處理程式類型都需要相同的介面繼承,因此您可能會想要建立單一類別,同時提供讀取和寫入功能。

下列程式代碼顯示元數據寫入器介面的定義,如 wincodecsdk.idl 檔案中所定義。

interface IWICMetadataWriter : IWICMetadataReader
{
    HRESULT SetValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in] const PROPVARIANT *pvarValue
        );

    HRESULT SetValueByIndex(
        [in] UINT nIndex,
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in] const PROPVARIANT *pvarValue
        );

    HRESULT RemoveValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId
        );

    HRESULT RemoveValueByIndex(
        [in] UINT nIndex
        );
};

SetValue 方法會將指定的元數據專案寫入元數據流。

SetValueByIndex 方法會將指定的元數據項目寫入元數據流中指定的索引。 索引不會參考標識碼,而是參考元數據區塊中項目的位置。

RemoveValue 方法會從中繼資料流中移除指定的中繼資料元素。

RemoveValueByIndex 方法會從元數據數據流中移除位於指定索引處的元數據專案。 拿掉項目之後,如果索引不是最後一個索引,則預期剩餘的元數據專案會佔用空出的索引。 預計移除項目之後,計數也會變更。

元數據寫入器有責任將 PROPVARIANT 項目轉換為格式所需的基礎結構。 不過,不同於元數據讀取器,VARIANT 類型通常不應該強制轉換成不同類型的類型,因為呼叫端特別指出要使用的數據類型。

您的元數據寫入器必須將所有元數據項目提交至影像數據流,包括隱藏或無法辨識的值。 這包括未知的巢狀中繼資料塊。 不過,編碼器有責任在開始儲存操作之前設定任何重要的元數據項目。

如果元數據數據流包含 big-endian 內容,則元數據寫入器會負責交換它處理的任何數據值。 它還負責在儲存時通知任何巢狀中繼資料寫入器,它們正在使用大端序的數據流。

藉由支援在元數據項目上進行設定和移除操作,以對應元數據格式的 VT_CLSID(GUID)類型,實作命名空間的建立和移除支援。 元數據寫入器會呼叫 WICSerializeMetadataContent 函式,以正確地將嵌套元數據寫入器內容嵌入至父元數據寫入器。

如果您的元數據格式支援就地編碼,您必須負責管理必要的填補。 如需了解更多關於即時編碼的詳細資訊,請參閱 WIC 中繼資料概覽讀取與寫入圖片中繼資料概覽

IWICPersistStream 介面

IWICPersistStream 介面繼承自 IPersistStream,並提供使用 WICPersistOptions 列舉來儲存和載入物件的其他方法。

下列程式代碼顯示 IWICPersistStream 介面的定義,如 wincodecsdk.idl 檔案中所定義。

interface IWICPersistStream : IPersistStream
{
    HRESULT LoadEx(
        [in, unique] IStream *pIStream,
        [in, unique] const GUID *pguidPreferredVendor,
        [in] DWORD dwPersistOptions
        );

    HRESULT SaveEx(
        [in] IStream *pIStream,
        [in] DWORD dwPersistOptions,
        [in] BOOL fClearDirty
        );
};

LoadEx 方法會提供您的元數據處理程式一個包含元數據區塊的數據流。

SaveEx 方法將元數據序列化為數據流。 如果提供的數據流與初始化數據流相同,您應該執行就地編碼。 如果支援就地編碼,當填補不足而無法執行就地編碼時,此方法應該會傳回WINCODEC_ERR_TOOMUCHMETADATA。 如果不支援原地編碼,則這個方法應該會傳回 WINCODEC_ERR_UNSUPPORTEDOPERATION。

必須實作 IPersistStream::GetSizeMax 方法,而且必須傳回後續儲存中寫入的元數據內容確切大小。

如果元數據寫入器是透過數據流初始化,則應該實作 IPersistStream::IsDirty 方法,以便讓影像可靠地判斷其內容是否已變更。

如果您的元數據格式支持嵌套元數據區塊,則元數據寫入器應在保存到數據流時,將內容的序列化委派給嵌套的元數據寫入器。

IWICStreamProvider 介面

元數據寫入器的 IWICStreamProvider 介面實作與元數據讀取器的介面相同。 如需詳細資訊,請參閱本檔中的「建立中繼資料讀取器」一節。

安裝和註冊元數據處理程式

若要安裝元數據處理程式,您必須提供處理程式元件,並在系統登錄中註冊它。 您可以決定如何及何時填入登錄機碼。

注意

為了便於閱讀,本文檔的以下各節中不會顯示實際的十六進位 GUID 機碼。 若要尋找指定易記名稱的十六進位值,請參閱 wincodec.idl 和 wincodecsdk.idl 檔案。

 

元數據處理程式登錄機碼

每個元數據處理程式都是由唯一的CLSID來識別,而且每個處理程式都必須在元數據處理程式的類別標識元 GUID 下註冊其CLSID。 每個處理程式類型的類別標識元定義於 wincodec.idl 中;讀取器的類別識別碼名稱是CATID_WICMetadataReader,而寫入器的類別標識碼名稱則CATID_WICMetadataWriter。

每個元數據處理程式都是由唯一的CLSID來識別,而且每個處理程式都必須在元數據處理程式的類別標識元 GUID 下註冊其CLSID。 每個處理程式類型的類別標識元定義於 wincodec.idl 中;讀取器的類別識別碼名稱是CATID_WICMetadataReader,而寫入器的類別標識碼名稱則CATID_WICMetadataWriter。

注意

在下列登錄機碼清單中,{Reader CLSID} 是指您為元數據讀取器提供的唯一 CLSID。 {Writer CLSID} 是指您為元數據寫入器提供的唯一 CLSID。 {Handler CLSID} 是指讀取器的 CLSID、寫入器的 CLSID,或兩者,視您提供的處理程式而定。 {Container GUID} 是指可以包含元數據區塊的容器物件(影像格式或元數據格式)。

 

下列登錄機碼會將您的元資料處理程式註冊到其他可用的元資料處理程式中:

[HKEY_CLASSES_ROOT\CLSID\{CATID_WICMetadataReaders}\Instance\{Reader CLSID}]
CLSID={Reader CLSID}
Friendly Name="Reader Name"

[HKEY_CLASSES_ROOT\CLSID\{CATID_ WICMetadataWriters}\Instance\{Writer CLSID}]
CLSID={Writer CLSID}
Friendly Name="Writer Name"

除了在各自的類別中註冊您的處理程式外,您還必須註冊其他鍵值,以提供特定於處理程式的資訊。 讀取器和寫入器共用類似的登錄機碼需求。 下列語法示範如何註冊處理程式。 讀取器處理程式和寫入器處理程式都必須以這種方式註冊,並使用各自的 CLSID:

[HKEY_CLASSES_ROOT\CLSID\{CLSID}]
"Vendor"={VendorGUID}
"Date"="yyyy-mm-dd"
"Version"="Major.Minor.Build.Number"
"SpecVersion"="Major.Minor.Build.Number"
"MetadataFormat"={MetadataFormatGUID}
"RequiresFullStream"=dword:1|0
"SupportsPadding"= dword:1|0
"FixedSize"=0

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\InProcServer32]
@="drive:\path\yourdll.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\{LCID}]
Author="Author's Name"
Description = " Metadata Description"
DeviceManufacturer ="Manufacturer Name"
DeviceModels="Device,Device"
FriendlyName="Friendly Name"

元數據讀取器

元數據讀取器註冊也包含描述讀取器如何內嵌在容器格式的密鑰。 容器格式可以是影像格式,例如 TIFF 或 JPEG;它也可以是另一種元數據格式,例如 IFD 元數據區塊。 原生支援的映像容器格式會列在 wincodec.idl 中;每個映像容器格式都會定義為 GUID,其名稱開頭為 GUID_ContainerFormat。 原生支援的元數據容器格式會列在 wincodecsdk.idl 中;每個元數據容器格式都會定義為 GUID,其名稱開頭為 GUID_MetadataFormat。

下列金鑰會註冊元數據讀取器支援的容器,以及從該容器讀取所需的數據。 讀取器所支援的每個容器都必須以這種方式註冊。

[HKEY_CLASSES_ROOT\CLSID\{Reader CLSID}\Containers\{Container GUID}\0]
"Position"=dword:00000000
"Pattern"=hex:ff,ff,ff,...
"Mask"=hex:ff,ff,ff,...
"DataOffset"=dword:00000006

Pattern 鍵描述用來將元數據區塊與讀取器匹配的二進位模式。 定義元數據讀取器的模式時,應該足夠可靠,正比對表示元數據讀取器可以瞭解正在處理的元數據區塊中的元數據。

DataOffset 鍵描述了元數據相對於區塊標頭的固定偏移量。 此索引鍵是選擇性的,如果未指定,表示無法使用區塊標頭的固定位移來找到實際元數據。

元數據寫入器

元數據寫入器註冊也包含索引鍵,描述如何寫出內嵌在容器格式的元數據內容前面的標頭。 如同讀取器,容器格式可以是影像格式或其他元數據區塊。

下列金鑰會註冊元數據寫入器支援的容器,以及寫入標頭和元數據所需的數據。 寫入器支援的每個容器都必須以這種方式進行註冊。

[HKEY_CLASSES_ROOT\CLSID\{Writer CLSID}\Containers\{Container GUID}]
"WritePosition"=dword:00000000
"WriteHeader"=hex:ff,ff,ff,...
"WriteOffset"=dword:00000000

WriteHeader 索引鍵描述要寫入之元數據區塊標頭的二進位模式。 這個二進位模式與元數據格式的讀取器模式索引鍵重合。

WriteOffset 鍵描述應該寫入元數據的固定位移,這個位移從區塊標頭開始計算。 此索引鍵是選擇性的,如果未指定,表示不應該使用標頭寫出實際的元數據。

簽署元數據處理程式

所有元數據處理程式都必須經過數字簽署,才能參與 WIC 探索程式。 WIC 不會載入任何未由受信任證書頒發機構單位簽署的處理程式。 如您需數位簽章的詳細資訊,請參閱 程式代碼簽署簡介

特殊考慮

下列各節包含您在建立自己的元數據處理程式時必須考慮的其他資訊。

PROPVARIANTS

WIC 會使用 PROPVARIANT 來代表讀取及寫入中繼資料項目。 PROPVARIANT 會為元資料格式中使用的元資料項目提供資料類型和資料值。 身為元數據處理程式的寫入器,您可以彈性地瞭解如何以元數據格式儲存數據,以及如何在元數據區塊內呈現數據。 下表提供指導方針,可協助您決定在不同情況下要使用的適當 PROPVARIANT 類型。

中繼資料型態為... 使用 PROPVARIANT 類型 PROPVARIANT 屬性
空白或不存在。 VT_EMPTY 不適用。
未定義。 VT_BLOB 使用 Blob 屬性來設定使用 CoTaskMemAlloc 配置的 BLOB 物件大小和指標。
元數據區塊。 VT_UNKNOWN 此類型會使用 punkVal 屬性。
類型陣列。 VT_VECTOR |VT_{type} 使用 ca{type} 屬性來設定使用 CoTaskMemAlloc 配置的陣列計數和指標。
元數據區塊的陣列。 VT_VECTOR | VT_VARIANT 使用 capropvar 屬性來設定 Variant 的陣列。
帶正負號的有理數值。 VT_I8 使用 hVal 屬性來設定值。 將高位字設定為分母,並將低位字設定為分子。
合理值。 VT_UI8 使用 uhVal 屬性來設定值。 將 HighPart 設定為分母,並將 LowPart 設定為 numerator。 請注意,LowPart 是無符號的 int。numerator 應該從無符號的 int 轉換成 int,以確保符號位(如果存在)能被保留。

 

若要避免陣列項目的重複,請勿使用安全陣列,只使用簡單的陣列。 這樣可減少應用程式在解譯 PROPVARIANT 類型時必須執行的工作。

請盡可能避免使用 VT_BYREF,並盡可能內嵌存儲值。 VT_BYREF 對小型類型沒有效率(通常見於元數據項目),而且不提供大小資訊。

在使用 PROPVARIANT之前,請一律呼叫 PropVariantInit 來初始化值。 當您完成 PROPVARIANT 時,請一律呼叫 PropVariantClear,以釋放配置給變數的任何記憶體。

8BIM 處理程式

撰寫 8BIM 元數據區塊的元數據處理程式時,您必須使用封裝 8BIM 簽章和標識碼的簽章。 例如,內建的 8BIMIPTC 元數據讀取器會針對讀取器發現提供下列登錄資訊:

[HKEY_CLASSES_ROOT\CLSID\{0010668C-0801-4DA6-A4A4-826522B6D28F}\Containers\{16100D66-8570-4BB9-B92D-FDA4B23ECE67}\0]
"Position"=dword:00000000
"Pattern"=hex:38,42,49,4d,04,04
"Mask"=hex:ff,ff,ff,ff,ff,ff
"DataOffset"=dword:00000006

8BIMIPTC 讀取器具有已註冊的模式:0x38、0x42、0x49、0x4D、0x04、0x04。 前四個字節(0x38、0x42、0x49、0x4D)是 8BIM 簽章,最後兩個字節(0x04,0x04)是 IPTC 記錄的標識符。

因此,若要撰寫 8BIM 元數據讀取器以取得解析資訊,您需要已註冊的模式0x38、0x42、0x49、0x4D、0x03、0xED。 同樣地,前四個字節(0x38、0x42、0x49、0x4D)是 8BIM 簽章。 不過,最後兩個字節(0x03,0xED),是 PSD 格式所定義的解析資訊標識碼。

概念

Windows 映射元件概觀

WIC 元數據概觀

元數據查詢語言概觀

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

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

其他資源

如何撰寫 WIC-Enabled CODEC