Megosztás a következőn keresztül:


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.

Referencia

IWICMetadataBlockReader

fogalmi

IWICBitmapFrameDecode implementálása

IWICBitmapSourceTransform implementálása

Hogyan írjunk egy WIC-Enabled CODEC-et

Windows képalkotó összetevő áttekintése