Přehled rozšiřitelnosti metadat
Toto téma představuje požadavky na vytváření vlastních obslužných rutin metadat pro komponentu Windows Imaging Component (WIC), včetně čtenářů metadat i zapisovačů. Popisuje také požadavky na rozšíření zjišťování komponent za běhu WIC tak, aby zahrnovaly vaše vlastní obslužné rutiny metadat.
Toto téma obsahuje následující části.
- požadavky
- Úvod
-
Vytváření čtečky metadat
- IWICMetadataReader – rozhraní
- IWICPersistStream rozhraní
- rozhraní IWICStreamProvider
- Vytvoření autora metadat
- Instalace a registrace obslužné rutiny metadat
-
Zvláštní úvahy
- propvariantů
- obslužné rutiny 8BIM
- související témata
Požadavky
Abyste pochopili toto téma, měli byste mít podrobné znalosti WIC, jejích komponent a metadat pro obrázky. Další informace o metadatech WIC najdete v přehled metadat WIC. Další informace o součástech WIC naleznete v tématu Windows Imaging Component Overview.
Úvod
Jak je popsáno v přehledu metadat WIC, v obrázku často existuje několik bloků metadat, přičemž každá z nich vystavuje různé typy informací v různých formátech metadat. Aby bylo možné pracovat s formátem metadat vloženým do obrázku, musí aplikace použít odpovídající obslužnou rutinu metadat. WIC poskytuje několik obslužných rutin metadat (čtečky metadat i zapisovačů), které umožňují číst a zapisovat konkrétní typy metadat, jako je Exif nebo XMP.
Kromě nativních obslužných rutin poskytuje WIC rozhraní API, která umožňují vytvářet nové obslužné rutiny metadat, které se účastní detekce komponent za běhu WIC. To umožňuje aplikacím, které používají WIC ke čtení a zápisu vlastních formátů metadat.
Následující kroky umožňují zpracovatelům metadat účastnit se zjišťování metadat za běhu WIC.
- Implementujte třídu obslužné rutiny pro čtení metadat (IWICMetadataReader), která zveřejňuje požadovaná rozhraní WIC pro čtení vlastního formátu metadat. To umožňuje aplikacím založeným na WIC číst formát metadat stejným způsobem, jakým čtou nativní formáty metadat.
- Implementujte třídu obslužné rutiny metadata-writer (IWICMetadataWriter), která zveřejňuje požadovaná rozhraní WIC pro kódování vlastního formátu metadat. To umožňuje aplikacím založeným na WIC serializovat formát metadat do podporovaných formátů obrázků.
- Digitálně podepisujte a zaregistrujte obslužné rutiny metadat. To umožňuje, aby obslužné rutiny metadat mohly být zjištěny za běhu tím, že odpovídají identifikačnímu vzoru v registru se vzorem vloženým do obrazového souboru.
Vytvoření čtečky metadat
Hlavní přístup k blokům metadat v rámci kodeku je prostřednictvím IWICMetadataBlockReader rozhraní, které každý kodek WIC implementuje. Toto rozhraní vypíše každý z bloků metadat vložených ve formátu obrázku, aby bylo možné identifikovat a inicializovat příslušného správce metadat pro každý blok. Bloky metadat, které WIC nerozpoznají, jsou považovány za neznámé a jsou definovány jako identifikátor GUID CLSID_WICUnknownMetadataReader. Chcete-li formát metadat rozpoznávat wiC, musíte vytvořit třídu, která implementuje tři rozhraní: IWICMetadataReader, IWICPersistStreama IWICStreamProvider.
Poznámka
Pokud má formát metadat omezení, která způsobují, že některé metody požadovaných rozhraní jsou nevhodné, měly by tyto metody vrátit WINCODEC_ERR_UNSUPPORTEDOPERATION.
IWICMetadataReader – rozhraní
Rozhraní IWICMetadataReader musí být implementováno při vytváření čtečky metadat. Toto rozhraní poskytuje přístup k základním položkám metadat v datovém toku formátu metadat.
Následující kód ukazuje definici rozhraní pro čtení metadat, jak je definováno v souboru 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
);
};
Metoda GetMetadataFormat vrátí identifikátor GUID formátu metadat.
Metoda GetMetadataHandlerInfo vrátí rozhraní IWICMetadataHandlerInfo, které poskytuje informace o obslužné rutině metadat. Patří sem informace, jako jsou formáty obrázků, které podporují formát metadat a jestli čtečka metadat vyžaduje přístup k úplnému datovému proudu metadat.
Metoda GetCount vrátí počet jednotlivých položek metadat (včetně vložených bloků metadat) nalezených v datovém proudu metadat.
Metoda GetValueByIndex vrátí položku metadat podle hodnoty indexu. Tato metoda umožňuje aplikacím procházet jednotlivé položky metadat v bloku metadat. Následující kód ukazuje, jak může aplikace tuto metodu použít k načtení každé položky metadat v bloku metadat.
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);
}
}
Metoda GetValue načte konkrétní položku metadat podle schématu nebo ID. Tato metoda je podobná GetValueByIndex metoda s tím rozdílem, že načte položku metadat, která má konkrétní schéma nebo ID.
Metoda GetEnumerator vrátí výčet každé položky metadat v bloku metadat. To umožňuje aplikacím používat enumerátor k navigaci ve formátu metadat.
Pokud formát metadat nemá představu o schématech pro položky metadat, getValue... metody by měly tuto vlastnost ignorovat. Pokud však formát podporuje pojmenování schématu, měli byste očekávat hodnotu NULL.
Pokud je položka metadat blokem vložených metadat, vytvořte obslužnou rutinu metadat z podstreamu vloženého obsahu a vraťte novou obslužnou rutinu metadat. Pokud pro vnořený blok není k dispozici žádná čtečka metadat, vytvořte instanci a vraťte neznámou čtečku metadat. Chcete-li vytvořit novou čtečku metadat pro vložený blok, zavolejte továrnu na komponenty pomocí metod CreateMetadataReaderFromContainer nebo CreateMetadataReader, nebo zavolejte funkci WICMatchMetadataContent.
Pokud datový proud metadat obsahuje big-endian obsah, je čtenář metadat zodpovědný za výměnu všech hodnot datových, které zpracovává. Zodpovídá také za informování všech čtenářů vnořených metadat, že pracují s velkými endovými datovými proudy. Všechny hodnoty by ale měly být vráceny v malém endian formátu.
Implementujte podporu navigace v oboru názvů pomocí dotazů, kde ID položky metadat je VT_CLSID
(GUID) odpovídající formátu metadat. Pokud je při analýze identifikována čtečka vnořených metadat pro tento formát, musí být vrácena. To umožňuje aplikacím používat čtečku dotazů metadat k vyhledávání ve formátu metadat.
Při získávání položky metadat podle ID byste měli použít funkci PropVariantChangeType k převodu ID do očekávaného typu. Čtečka IFD například převede ID na typ VT_UI2
, aby se shodovala s datovým typem ID značky IFD USHORT. Vstupní typ a očekávaný typ musí být PROPVARIANT, aby to fungovalo. To není povinné, ale převedení zjednodušuje kód, který volá čtenáře, aby dotazoval na položky metadat.
IWICPersistStream – rozhraní
Rozhraní IWICPersistStream dědí z IPersistStream a poskytuje další metody pro ukládání a načítání objektů pomocí WICPersistOptions výčtu.
Následující kód ukazuje definici IWICPersistStream rozhraní, jak je definováno v souboru 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
);
};
Metoda LoadEx poskytuje čtenáři metadat datový proud obsahující blok metadat. Čtenář analyzuje tento datový proud pro přístup k podkladovým položkám metadat. Čtečka metadat je inicializována substreamem, který je umístěn na začátku hrubého obsahu metadat. Pokud čtenář nevyžaduje úplný datový proud, je substream omezen v rozsahu pouze na obsah bloku metadat; v opačném případě se úplný datový proud metadat poskytuje s pozicí nastavenou na začátku bloku metadat.
Metoda SaveEx je používána zapisovači metadat k serializaci bloku metadat. Pokud se SaveEx používá v čtečce metadat, mělo by se vrátit WINCODEC_ERR_UNSUPPORTEDOPERATION.
IWICStreamProvider – rozhraní
Rozhraní IWICStreamProvider umožňuje čtenáři metadat poskytovat odkazy na datový proud obsahu, poskytovat informace o datovém proudu a aktualizovat verze streamu uložené v mezipaměti.
Následující kód ukazuje definici IWICStreamProvider rozhraní, jak je definováno v souboru wincodecsdk.idl.
interface IWICStreamProvider : IUnknown
{
HRESULT GetStream(
[out] IStream **ppIStream
);
HRESULT GetPersistOptions(
[out] DWORD *pdwPersistOptions
);
HRESULT GetPreferredVendorGUID(
[out] GUID *pguidPreferredVendor
);
HRESULT RefreshStream(
);
};
Metoda GetStream načte odkaz na datový proud metadat. Vrácený datový proud by měl mít resetování ukazatele datového proudu na počáteční pozici. Pokud formát metadat vyžaduje úplný přístup ke streamu, počáteční pozice by měla být začátkem bloku metadat.
Metoda GetPersistOptions vrátí aktuální nastavení proudu ze seznamu WICPersistOptions.
Metoda GetPreferredVendorGUID vrátí identifikátor GUID dodavatele čtečky metadat.
Metoda RefreshStream aktualizuje datový proud metadat. Tato metoda musí volat LoadEx s datovým proudem NULL pro všechny vnořené bloky metadat. To je nezbytné, protože bloky vnořených metadat a jejich položky už nemusí existovat kvůli místní úpravě.
Vytvoření zapisovače metadat
Zapisovač metadat je typ obslužné rutiny metadat, která poskytuje způsob, jak serializovat blok metadat na rámec obrázku nebo mimo jednotlivý rámec, pokud ho formát obrázku podporuje. Hlavním přístupem k zapisovačům metadat v kodeku je IWICMetadataBlockWriter rozhraní, které každý kodér WIC implementuje. Toto rozhraní umožňuje aplikacím vytvořit výčet všech bloků metadat vložených do obrázku, aby bylo možné zjistit a vytvořit instanci příslušného zapisovače metadat pro každý blok metadat. Bloky metadat, které nemají odpovídající zapisovač metadat, jsou považovány za neznámé a jsou definovány jako identifikátor GUID CLSID_WICUnknownMetadataReader. Chcete-li aplikacím s podporou WIC umožnit psát a serializovat váš formát metadat, musíte vytvořit třídu, která implementuje následující rozhraní: IWICMetadataWriter, IWICMetadataReader, IWICPersistStreama IWICStreamProvider.
Poznámka
Pokud má formát metadat omezení, která činí některé metody požadovaných rozhraní nevhodnými, měly by tyto metody vrátit WINCODEC_ERR_UNSUPPORTEDOPERATION.
IWICMetadataWriter – rozhraní
Rozhraní IWICMetadataWriter musí být implementováno vaším zapisovačem metadat. Navíc, protože IWICMetadataWriter dědí z IWICMetadataReader, musíte také implementovat všechny metody IWICMetadataReader. Vzhledem k tomu, že oba typy obslužných rutin vyžadují stejnou dědičnost rozhraní, můžete chtít vytvořit jednu třídu, která poskytuje funkce čtení i zápisu.
Následující kód ukazuje definici rozhraní pro zápis metadat, jak je definováno v souboru 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
);
};
Metoda SetValue zapíše zadanou položku metadat do datového proudu metadat.
Metoda SetValueByIndex zapíše zadanou položku metadat do zadaného indexu ve streamu metadat. Index neodkazuje na ID, ale na pozici položky v bloku metadat.
Metoda RemoveValue odebere zadanou položku metadat z datového proudu metadat.
Metoda RemoveValueByIndex odebere položku metadat v zadaném indexu z datového proudu metadat. Po odebrání položky se očekává, že zbývající položky metadat zabírají uvolněný index, pokud index není posledním indexem. Očekává se také, že se počet po odebrání položky změní.
Za převod položek PROPVARIANT na podkladovou strukturu požadovanou vaším formátem je zodpovědný zapisovatel metadat. Na rozdíl od čtečky metadat by však typy VARIANT neměly být obvykle přetěžovány na různé typy, protože volající konkrétně označuje, jaký datový typ se má použít.
Autor metadat musí zapsat všechny položky metadat do datového proudu obrázku, včetně skrytých nebo nerozpoznaných hodnot. To zahrnuje neznámé vnořené bloky metadat. Je ale zodpovědností kodéru nastavit všechny důležité položky metadat před zahájením operace uložení.
Pokud datový proud metadat obsahuje big-endian pořadí bajtů, zapisovač metadat je odpovědný za prohození hodnot dat, které zpracovává. Zodpovídá také za informování všech vnořených zapisovačů metadat, že při ukládání pracují s velkým datovým proudem endian.
Implementujte podporu vytváření a odebírání oboru názvů tím, že umožníte operace nastavení a odebrání u položek metadat s typem VT_CLSID
(GUID), které odpovídají formátu metadat. Zapisovač metadat volá funkci WICSerializeMetadataContent pro správné vložení obsahu vnořeného zapisovače metadat do zapisovače nadřazených metadat.
Pokud formát metadat podporuje místní kódování, zodpovídáte za správu požadovaného odsazení. Další informace o místní kódování najdete v tématu přehled metadat WIC a Přehled čtení a zápisu metadat obrázků.
IWICPersistStream – rozhraní
Rozhraní IWICPersistStream dědí z IPersistStream a poskytuje další metody pro ukládání a načítání objektů pomocí WICPersistOptions výčtu.
Následující kód ukazuje definici IWICPersistStream rozhraní, jak je definováno v souboru 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
);
};
Metoda LoadEx poskytuje vašemu zpracovateli metadat datový tok obsahující váš blok metadat.
Metoda SaveEx serializuje metadata do datového toku. Pokud je zadaný datový proud stejný jako inicializační stream, měli byste provést místní kódování. Pokud je podporováno místní kódování, měla by tato metoda vrátit WINCODEC_ERR_TOOMUCHMETADATA, pokud není dostatek odsazení k provedení místního kódování. Pokud místní kódování není podporováno, měla by tato metoda vrátit WINCODEC_ERR_UNSUPPORTEDOPERATION.
IPersistStream::GetSizeMax metoda musí být implementována a musí vrátit přesnou velikost obsahu metadat, který by byl zapsán v následném uložení.
Metoda IPersistStream::IsDirty by měla být implementována, pokud je zapisovač metadat inicializován prostřednictvím datového proudu, aby obrázek mohl spolehlivě určit, zda se změnil jeho obsah.
Pokud formát metadat podporuje vnořené bloky metadat, měl by zapisovač metadat delegovat na zapisovače vnořených metadat serializaci obsahu při ukládání do datového proudu.
IWICStreamProvider – rozhraní
Implementace rozhraní IWICStreamProvider pro zapisovač metadat je stejná jako u čtečky metadat. Další informace naleznete v části Vytvoření čtečky metadat v tomto dokumentu.
Instalace a registrace obslužné rutiny metadat
Chcete-li nainstalovat obslužnou rutinu metadat, musíte zadat sestavení obslužné rutiny a zaregistrovat ho v systémovém registru. Můžete se rozhodnout, jak a kdy se naplní klíče registru.
Poznámka
Pro čitelnost se skutečné šestnáctkové identifikátory GUID nezobrazují v klíčích registru zobrazených v následujících částech tohoto dokumentu. Pokud chcete najít šestnáctkovou hodnotu pro zadaný popisný název, podívejte se na soubory wincodec.idl a wincodecsdk.idl.
Klíče registru pro obsluhu metadat
Každá obslužná rutina metadat je identifikována jedinečným identifikátorem CLSID a každá obslužná rutina musí zaregistrovat svůj CLSID v rámci GUID kategorie identifikátoru obslužné rutiny metadat. ID kategorie každého typu obslužné rutiny je definováno v souboru wincodec.idl; název ID kategorie pro čtenáře je CATID_WICMetadataReader a název ID kategorie pro zapisovače je CATID_WICMetadataWriter.
Každá obslužná rutina metadat je identifikována jedinečným identifikátorem CLSID a každá obslužná rutina musí svůj CLSID registrovat pod identifikátorem GUID kategorie ID obslužné rutiny metadat. ID kategorie každého typu obslužné rutiny je definováno v souboru wincodec.idl; název ID kategorie pro čtenáře je CATID_WICMetadataReader a název ID kategorie pro zapisovače je CATID_WICMetadataWriter.
Poznámka
V následujících výpisech klíčů registru odkazuje {Reader CLSID} na jedinečný identifikátor CLSID, který zadáte pro čtečku metadat. {Writer CLSID} odkazuje na jedinečný identifikátor CLSID, který zadáte pro zapisovač metadat. {Handler CLSID} odkazuje na CLSID čtenáře, CLSID zapisovače nebo obojí v závislosti na tom, které obslužné rutiny poskytujete. {GUID kontejneru} odkazuje na objekt kontejneru (formát obrázku nebo formát metadat), který může obsahovat blok metadat.
Následující klíče registru zaregistrují vaši obslužnou rutinu metadat spolu s dalšími dostupnými obslužnými rutinami metadat:
[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"
Kromě registrace obslužných rutin v příslušných kategoriích musíte také zaregistrovat další klíče, které poskytují informace specifické pro obslužnou rutinu. Čtenáři a zapisovači mají obdobné požadavky na klíče registru. Následující syntaxe ukazuje, jak zaregistrovat obslužnou rutinu. Obslužná rutina čtečky i obslužná rutina zapisovače musí být tímto způsobem registrovány pomocí příslušných identifikátorů CLSI:
[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"
Čtenáři metadat
Registrace čtečky metadat obsahuje také klíče, které popisují, jak může být čtečka vložena do formátu kontejneru. Formát kontejneru může být formát obrázku, jako je TIFF nebo JPEG; může to být také jiný formát metadat, například blok metadat IFD. Nativně podporované formáty kontejneru imagí jsou uvedeny v wincodec.idl; každý formát kontejneru image je definován jako identifikátor GUID s názvem, který začíná GUID_ContainerFormat. Nativně podporované formáty kontejneru metadat jsou uvedeny v wincodecsdk.idl; každý formát kontejneru metadat je definován jako identifikátor GUID s názvem, který začíná GUID_MetadataFormat.
Následující klíče registrují kontejner, který čtenář metadat podporuje, a data potřebná ke čtení z tohoto kontejneru. Každý kontejner podporovaný čtenářem musí být tímto způsobem registrován.
[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
Klíč vzoru popisuje binární vzor, který se používá k přiřazení bloku metadat čtenáři. Při definování vzoru pro čtečku metadat by mělo být dostatečně spolehlivé, že kladná shoda znamená, že čtenář metadat může pochopit metadata v bloku metadat, který se zpracovává.
Klíč DataOffset popisuje pevný posun metadat z hlavičky bloku. Tento klíč je nepovinný a pokud není zadaný, znamená to, že skutečná metadata nelze nalézt pomocí pevného posunu od hlavičky bloku.
Zapisovače metadat
Registrace zapisovače metadat obsahuje také klíče, které popisují, jak zapsat hlavičku před obsahem metadat vloženým ve formátu kontejneru. Stejně jako u čtenáře může být formát kontejneru formát obrázku nebo jiný blok metadat.
Následující klíče registrují kontejner, který zapisovač metadat podporuje, a data potřebná k zápisu hlavičky a metadat. Každý kontejner podporovaný zapisovačem musí být tímto způsobem registrován.
[HKEY_CLASSES_ROOT\CLSID\{Writer CLSID}\Containers\{Container GUID}]
"WritePosition"=dword:00000000
"WriteHeader"=hex:ff,ff,ff,...
"WriteOffset"=dword:00000000
Klíč WriteHeader popisuje binární vzor hlavičky bloku metadat, která se má zapsat. Tento binární vzor se shoduje s klíčem vzoru čtenáře formátu metadat.
Klíč WriteOffset popisuje pevný posun od hlavičky bloku, do které se mají metadata zapisovat. Tento klíč je nepovinný a pokud není zadaný, znamená to, že by se skutečná metadata neměla zapisovat s hlavičkou.
Podepsání zpracovatele metadat
Všechny obslužné rutiny metadat musí být digitálně podepsané, aby se mohly účastnit procesu objevování WIC. WIC nenačte žádnou obslužnou rutinu, která není podepsaná důvěryhodnou certifikační autoritou. Další informace o digitálním podepisování naleznete v tématu Úvod do podepisování kódu.
Zvláštní aspekty
Následující části obsahují další informace, které je nutné vzít v úvahu při vytváření vlastních obslužných rutin metadat.
PROPVARIANTY
WIC používá PROPVARIANT k reprezentaci položky metadat pro čtení i zápis. A PROPVARIANT poskytuje datový typ a hodnotu dat pro položku metadat použitá ve formátu metadat. Jako zapisovač obslužné rutiny metadat máte spoustu flexibility, jak se data ukládají ve formátu metadat a jak jsou data reprezentována v rámci bloku metadat. Následující tabulka obsahuje pokyny, které vám pomůžou při rozhodování o vhodném typu PROPVARIANT, který se má použít v různých situacích.
Typ metadat je... | Použijte typ PROPVARIANT | VLASTNOST PROPVARIANT |
---|---|---|
Prázdné nebo neexistující. | VT_EMPTY | Nelze použít. |
Nedefinovaný. | VT_BLOB | Pomocí vlastnosti objektu blob nastavte velikost a ukazatel na objekt BLOB přidělený pomocí CoTaskMemAlloc. |
Blok metadat. | VT_UNKNOWN | Tento typ používá vlastnost punkVal. |
Pole typů. | VT_VECTOR | VT_{type} | Pomocí vlastnosti ca{type} nastavte počet a ukazatel na pole přidělené pomocí CoTaskMemAlloc. |
Pole bloků metadat. | VT_VECTOR | VT_VARIANT | K nastavení pole variant použijte vlastnost capropvar. |
Racionální hodnota se znaménkem. | VT_I8 | K nastavení hodnoty použijte hVal vlastnost. Nastavte vysoké slovo na jmenovatel a nízké slovo na čitatel. |
Racionalní hodnota. | VT_UI8 | K nastavení hodnoty použijte vlastnost uhVal. Nastavte HighPart na jmenovatel a LowPart na čitatel. Všimněte si, že LowPart je nepodepsaný int. Čitatel by měl být převeden z nepodepsaného int na int, aby se zajistilo, že je bit znaménka v případě přítomnosti zachován. |
Aby se zabránilo redundanci při reprezentaci položek pole, nepoužívejte bezpečná pole; používejte pouze jednoduchá pole. Tím se sníží práce, kterou aplikace potřebuje vykonat při interpretaci typů PROPVARIANT.
Pokud je to možné, nepoužívejte VT_BYREF
a ukládejte hodnoty do textu.
VT_BYREF
je neefektivní pro malé typy (společné pro položky metadat) a neposkytuje informace o velikosti.
Před použitím PROPVARIANTvždy zavolejte PropVariantInit, abyste inicializovali hodnotu. Jakmile dokončíte práci s proměnnou PROPVARIANT, vždy volejte PropVariantClear pro uvolnění jakékoliv paměti přidělené této proměnné.
Obslužné rutiny 8BIM
Při zápisu obslužné rutiny metadat pro blok metadat 8BIM je nutné použít podpis, který zapouzdřuje podpis 8BIM i ID. Nativní čtečka metadat 8BIMIPTC například poskytuje následující informace registru pro zjišťování čtenářů:
[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
Čtenář 8BIMIPTC má registrovaný vzor 0x38, 0x42, 0x49, 0x4D, 0x04, 0x04. První čtyři bajty (0x38, 0x42, 0x49, 0x4D) jsou podpisem 8BIM a poslední dva bajty (0x04, 0x04) jsou ID záznamu IPTC.
Pokud tedy chcete napsat čtečku metadat 8BIM pro informace o řešení, budete potřebovat registrovaný vzor 0x38, 0x42, 0x49, 0x4D, 0x03, 0xED. Znovu platí, že první čtyři bajty (0x38, 0x42, 0x49, 0x4D) jsou podpisem 8BIM. Poslední dva bajty (0x03, 0xED), jsou však ID informací o rozlišení definované formátem PSD.
Související témata
-
koncepční
-
Přehled komponent Windows Imaging
-
Přehled čtení a zápisu metadat obrázků
-
další prostředky