中繼資料擴充性概觀

本主題介紹為 Windows 映像處理元件 (WIC) 建立自訂元資料處理程式的需求,包括中繼資料讀取器和寫入器。 它也會討論擴充 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 辨識元資料格式,您必須建立實作三個介面的類別: IWICMetadataReaderIWICPersistStreamIWICStreamProvider

注意

如果您的元資料格式有轉譯某些必要介面方法不適當的限制,這類方法應該會傳回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 函式。

如果中繼資料資料流程包含大端內容,中繼資料讀取器會負責交換它處理的任何資料值。 它也會負責通知任何巢狀中繼資料讀取器,這些讀取器正在使用巨量端資料流程。 不過,所有值都應該以小端格式傳回。

藉由支援中繼資料專案識別碼是 VT_CLSID 對應至元資料格式 (GUID) 的查詢,實作命名空間導覽的支援。 如果在剖析期間識別該格式的巢狀中繼資料讀取器,則必須傳回它。 這可讓應用程式使用中繼資料查詢讀取器來搜尋元資料格式。

依識別碼取得中繼資料專案時,您應該使用 PropVariantChangeType 函式 將識別碼強制轉換成預期的類型。 例如,IFD 讀取器會將識別碼強制輸入 VT_UI2 ,以符合 IFD 標籤識別碼 USHORT 的資料類型。 輸入類型和預期的類型都必須是 PROPVARIANT 才能執行此動作。 這並非必要專案,但執行此強制會簡化程式碼,以呼叫讀取器來查詢中繼資料專案。

IWICPersistStream 介面

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

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

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介面可讓您的中繼資料讀取器提供其內容資料流程的參考、提供資料流程的相關資訊,以及重新整理資料流程的快取版本。

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

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 的應用程式序列化和寫入元資料格式,您必須建立實作下列介面的類別:IWICMetadataWriter、IWICMetadataReaderIWICPersistStreamIWICStreamProvider

注意

如果您的元資料格式有轉譯某些必要介面方法不適當的限制,這類方法應該會傳回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 類型通常不應該強制轉換成不同的類型,因為呼叫端特別指出要使用的資料類型。

您的中繼資料寫入器必須將所有中繼資料專案認可至影像資料流程,包括隱藏或無法辨識的值。 這包括未知的巢狀中繼資料區塊。 不過,在起始儲存作業之前,編碼器必須負責設定任何重要的中繼資料專案。

如果中繼資料資料流程包含大端內容,中繼資料寫入器會負責交換它處理的任何資料值。 它也負責通知任何巢狀中繼資料寫入器,讓他們在儲存時使用巨量資料流程。

藉由支援設定和移除中繼資料專案的作業,實作命名空間建立和移除的支援,其類型 VT_CLSID 為 GUID () 對應至元資料格式。 中繼資料寫入器會呼叫 WICSerializeMetadataContent 函式,以正確地將巢狀中繼資料寫入器內容內嵌至父中繼資料寫入器。

如果您的元資料格式支援就地編碼,您必須負責管理必要的填補。 如需就地編碼的詳細資訊,請參閱 WIC 中繼資料概觀讀取和寫入影像中繼資料的概觀

IWICPersistStream 介面

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

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

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。 {寫入器 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 屬性來設定值。 將高字設定為分母,並將低字設定為 Numerator。
合理值。 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