Az IWICMetadataBlockReader implementálása
IWICMetadataBlockReader
A metaadatok több blokkja gyakran létezik egy képen belül, és mindegyik különböző típusú információkat ad ki különböző formátumokban. A Windows Képalkotó összetevő (WIC) modellben a metaadat-kezelők olyan különálló összetevők, amelyek a dekóderekhez hasonlóan futásidőben is felderíthetők. Minden metaadat-formátum külön kezelővel rendelkezik, és mindegyik metaadat-kezelő bármilyen képformátummal használható, amely támogatja az általa kezelt metaadat-formátumot. Ezért ha a képformátum támogatja az EXIF, az XMP, az IPTC vagy más formátumot, akkor kihasználhatja a WIC-vel szállított formátumok szabványos metaadat-kezelőinek előnyeit, és nem kell sajátot írnia. Ha új metaadat-formátumot hoz létre, meg kell írnia hozzá egy metaadat-kezelőt, amelyet a rendszer futásidőben fog felderíteni és meghívni, ahogyan a standardok is.
Jegyzet
Ha a képformátum egy címkézett képfájlformátumon (TIFF) vagy JPEG-tárolón alapul, nem kell metaadatkezelőket írnia (kivéve, ha új vagy védett metaadatformátumot fejleszt). A TIFF- és JPEG-tárolókban a metaadatblokkok az IFD-ken belül találhatók, és mindegyik tároló eltérő HAD-struktúrával rendelkezik. A WIC mindkét tárolóformátumhoz biztosít IFD-kezelőket, amelyek az IFD-struktúrában navigálnak, és a szabványos metaadat-kezelőkhöz delegálnak, hogy hozzáférjenek a bennük lévő metaadatokhoz. Így ha a képformátum ezen tárolók bármelyikén alapul, automatikusan kihasználhatja a WIC IFD kezelőinek előnyeit. Ha azonban rendelkezik saját, egyedi legfelső szintű metaadat-struktúrával rendelkező védett tárolóformátummal, olyan kezelőt kell írnia, amely képes navigálni a legfelső szintű struktúrában, és delegálni a megfelelő metaadat-kezelőkhöz, ahogyan az IFD kezelői teszik.)
Ugyanúgy, ahogyan a WIC absztrakciós réteget biztosít az alkalmazások számára, amely lehetővé teszi számukra, hogy az összes képformátummal ugyanúgy működjenek, mint a konzisztens interfészek halmazán keresztül, a WIC absztrakciós réteget biztosít a kodekkészítők számára a metaadat-formátumok tekintetében. Ahogy korábban már említettük, a kodekkészítőknek általában nem kell közvetlenül dolgozniuk a képeken található különböző metaadat-formátumokkal. Azonban minden kodek szerzője felelős azért, hogy módot biztosítson a metaadatblokkok számbavételére, hogy az egyes blokkokhoz megfelelő metaadat-kezelőt lehessen felderíteni és példányosítani.
Ezt a felületet a keretszintű dekódolási osztályban kell implementálnia. Előfordulhat, hogy a tárolószintű dekóderosztályban is implementálnia kell, ha a képformátum minden egyes képkereten kívül teszi elérhetővé a globális metaadatokat.
interface IWICMetadataBlockReader : IUnknown
{
// All methods required
HRESULT GetContainerFormat ( GUID *pguidContainerFormat );
HRESULT GetCount ( UINT *pcCount );
HRESULT GetEnumerator ( IEnumUnknown **ppIEnumMetadata );
HRESULT GetReaderByIndex ( UINT nIndex, IWICMetadataReader **ppIMetadataReader );
}
Kontejnerformátum Lekérése
GetContainerFormat ugyanaz, mint a GetContainerFormat metódus a IWICBitmapDecoder megvalósításánál.
GetCount
GetCount a kerethez társított legfelső szintű metaadatblokkok számát adja vissza.
GetEnumerator
GetEnumerator egy enumerátort ad vissza, amellyel a hívó számba vehet a keret metaadatblokkjait, és elolvashatja a metaadataikat. A módszer implementálásához minden metaadatblokkhoz létre kell hoznia egy metaadat-olvasót, és végre kell hajtania egy enumerálási objektumot, amely a metaadat-olvasók gyűjteményén keresztül számbavételt hajt végre. Az enumerálási objektumnak implementálnia kell az IEnumUnknown-t, hogy visszaadásakor a ppIEnumMetadata paraméterben át tudja alakítani IEnumUnknown típusúvá.
Az enumerálási objektum implementálásakor az összes metaadat-olvasót létrehozhatja az IWICMetadataBlockReader objektum első létrehozásakor vagy az enumerálási objektum első létrehozásakor, vagy lazán létrehozhatja őket az IEnumUnknown::Next metódus implementációja során. Számos esetben hatékonyabb, ha késleltetve hozzuk létre őket, de a következő példában a blokkolvasók mind a konstruktorban jönnek létre a helytakarékosság érdekében.
public class MetadataReaderEnumerator : public IEnumUnknown
{
UINT m_current;
UINT m_blockCount;
IWICMetadataReader** m_ppMetadataReader;
IStream* m_pStream;
MetadataReaderEnumerator()
{
// Set m_blockCount to the number of metadata blocks in the frame.
...
m_ppMetadataReader = IWICMetadataReader*[m_blockCount];
m_current = 0;
for (UINT x=0; x < m_blockCount; x++)
{
// Find the position in the file where the xth
// block of metadata lives and seek m_piStream
// to that position.
...
m_pComponentFactory->CreateMetadataReaderFromContainer(
GUID_ContainerFormatTiff,
NULL,
WICPersistOptions.WICPersistOptionsDefault |
WICMetadataCreationOptions.WICMetadataCreationDefault,
m_pStream, &m_ppMetadataReader[x]);
}
}
// Implementation of IEnumUnknown and IUnknown interfaces
...
}
A metaadat-olvasók létrehozásához használja a CreateMetadataReaderFromContainer metódust. A metódus meghívásakor a tárolóformátum GUID-azonosítóját adja át a guidContainerFormat paraméterben. Ha van preferált szállítója a metaadat-olvasóhoz, adja át a preferált szállító GUID azonosítóját a pGuidVendor paraméterben. Ha például a vállalata metaadat-kezelőket ír, és szeretné használni a sajátját, ha van ilyen, megadhatja a szállítója GUID azonosítóját. A legtöbb esetben csak át kell adnia NULL, és hagyja, hogy a rendszer válassza ki a megfelelő metaadat-olvasót. Ha egy adott szállítót kér, és az adott szállító rendelkezik a számítógépre telepített metaadat-olvasóval, a WIC visszaadja a szállító olvasóját. Ha azonban a kért szállító nem rendelkezik a számítógépre telepített metaadat-olvasóval, és megfelelő metaadat-olvasó áll rendelkezésre, a rendszer akkor is visszaadja az olvasót, ha nem az előnyben részesített szállítótól származik. Ha a számítógépen nincs metaadat-olvasó a blokk metaadatainak típusához, az összetevő-előállító visszaadja az Ismeretlen metaadat-kezelőt, amely bináris nagy objektumként (BLOB) kezeli a metaadat-blokkot, és anélkül deszerializálja a metaadat-blokkot a fájlból, hogy megkísérli elemezni.
A dwOptions paraméter esetében végezzen egy OR műveletet a megfelelő WICPersistOptions és a megfelelő WICMetadataCreationOptionsközött. A WICPersistOptions leírja, hogyan van elrendezve a tároló. Az alapértelmezett a little-endian.
enum WICPersistOptions
{
WICPersistOptionDefault,
WICPersistOptionLittleEndian,
WICPersistOptionBigEndian,
WICPersistOptionStrictFormat,
WICPersistOptionNoCacheStream,
WICPersistOptionPreferUTF8
};
A WICMetadataCreationOptions adja meg, hogy vissza szeretné-e szerezni az UnknownMetadataHandlert, ha nem található metaadat-olvasó az adott blokk metaadat-formátumát olvasó gépen. WICMetadataCreationAllowUnknown az alapértelmezett érték, és mindig engedélyeznie kell az UnknownMetadtaHandler létrehozását. Az UnknownMetadataHandler blobként kezeli a nem felismert metaadatokat. Nem tudja elemezni, de BLOB-ként írja ki a streambe, és sértetlenül megőrzi, amikor a kódolás során vissza van írva a streambe. Ez biztonságossá teszi a metaadat-kezelők létrehozását olyan védett metaadatokhoz vagy metaadat-formátumokhoz, amelyek nem a rendszerrel szállíthatók. Mivel a metaadatok érintetlenül maradnak, még akkor is, ha az azt felismerő számítógépen nincs kezelő, a megfelelő metaadat-kezelő telepítésekor a metaadatok továbbra is ott lesznek, és olvashatók lesznek. Ha nem engedélyezi az UnknownMetadataHandler létrehozását, a másik lehetőség a nem felismert metaadatok elvetése vagy felülírása. Ez az adatvesztés egy formája.
Jegyzet
Ha saját metaadat-kezelőt ír a védett metaadatokhoz, soha ne adjon meg hivatkozásokat a metaadatblokkon kívülre. Annak ellenére, hogy az UnknownMetadataHandler érintetlenül őrzi meg a metaadatokat, a metaadatok a fájlok szerkesztésekor kerülnek áthelyezésre, és a saját blokkon kívüli bármire való hivatkozás a továbbiakban nem lesz érvényes, amikor ez történik.
enum WICMetadataCreationOptions
{
WICMetadataCreationDefault = 0x00000000,
WICMetadataCreationAllowUnknown = WICMetadataCreationDefault,
WICMetadataCreationFailUnknown = 0x00010000,
WICMetadataCreationMask = 0xFFFF0000
};
A pIStream paraméter a dekódolni kívánt stream. Mielőtt továbbadja a streamet, meg kell keresnie annak a metaadat-blokknak az elejét, amelyhez olvasót kér. A IStream metaadatblokkjának megfelelő metaadat-olvasót a ppiReader paraméter adja vissza.
GetReaderByIndex
GetReaderByIndex kérése a gyűjtemény adott indexén lévő metaadat-olvasót adja vissza.
Kapcsolódó témakörök
-
Referencia
-
fogalmi
-
IWICBitmapFrameDecode implementálása
-
IWICBitmapSourceTransform implementálása