Partager via


Implémentation d’IWICMetadataBlockReader

Iwicmetadatablockreader

Plusieurs blocs de métadonnées existent souvent dans une image, chacun exposant différents types d’informations dans différents formats. Dans le modèle WIC (Windows Imaging Component), les gestionnaires de métadonnées sont des composants distincts qui, comme les décodeurs, peuvent être découverts au moment de l’exécution. Chaque format de métadonnées a un gestionnaire distinct, et chacun de ces gestionnaires de métadonnées peut être utilisé avec n’importe quel format d’image qui prend en charge le format de métadonnées qu’il gère. Par conséquent, si votre format d’image prend en charge EXIF, XMP, IPTC ou un autre format, vous pouvez tirer parti des gestionnaires de métadonnées standard pour ces formats fournis avec WIC, et vous n’avez pas besoin d’écrire les vôtres. Bien sûr, si vous créez un nouveau format de métadonnées, vous devez écrire un gestionnaire de métadonnées pour celui-ci, qui sera découvert et appelé au moment de l’exécution, tout comme les formats standard.

Notes

Si votre format d’image est basé sur un conteneur TIFF (Tagged Image File Format) ou JPEG, vous n’avez pas besoin d’écrire de gestionnaires de métadonnées (sauf si vous développez un format de métadonnées nouveau ou propriétaire). Dans les conteneurs TIFF et JPEG, les blocs de métadonnées se trouvent dans les IFD, et chaque conteneur a une structure IFD différente. WIC fournit des gestionnaires IFD pour ces deux formats de conteneur qui naviguent dans la structure IFD et délèguent aux gestionnaires de métadonnées standard pour accéder aux métadonnées qu’ils contiennent. Par conséquent, si votre format d’image est basé sur l’un de ces conteneurs, vous pouvez automatiquement tirer parti des gestionnaires IFD WIC. Toutefois, si vous avez un format de conteneur propriétaire qui a sa propre structure de métadonnées de niveau supérieur unique, vous devez écrire un gestionnaire qui peut naviguer dans cette structure de niveau supérieur et déléguer aux gestionnaires de métadonnées appropriés, comme le font les gestionnaires IFD.)

 

De la même façon que WIC fournit une couche d’abstraction pour les applications qui leur permet d’utiliser tous les formats d’image de la même façon via un ensemble cohérent d’interfaces, WIC fournit une couche d’abstraction pour les auteurs de codecs en ce qui concerne les formats de métadonnées. Comme indiqué précédemment, les auteurs de codecs n’ont généralement pas besoin d’utiliser directement les différents formats de métadonnées qui peuvent être présents dans une image. Toutefois, chaque auteur de codec est chargé de fournir un moyen d’énumérer les blocs de métadonnées afin qu’un gestionnaire de métadonnées approprié puisse être découvert et instancié pour chaque bloc.

Vous devez implémenter cette interface sur votre classe de décodage au niveau de l’image. Vous devrez peut-être également l’implémenter sur votre classe de décodeur au niveau du conteneur si votre format d’image expose des métadonnées globales en dehors des images individuelles.

interface IWICMetadataBlockReader : IUnknown
{
   // All methods required
   HRESULT GetContainerFormat ( GUID *pguidContainerFormat );
   HRESULT GetCount ( UINT *pcCount );
   HRESULT GetEnumerator ( IEnumUnknown **ppIEnumMetadata );
   HRESULT GetReaderByIndex ( UINT nIndex, IWICMetadataReader **ppIMetadataReader );
}

GetContainerFormat

GetContainerFormat est identique à la méthode GetContainerFormat lors de l’implémentation d’IWICBitmapDecoder.

GetCount

GetCount retourne le nombre de blocs de métadonnées de niveau supérieur associés au cadre.

GetEnumerator

GetEnumerator retourne un énumérateur que l’appelant peut utiliser pour énumérer les blocs de métadonnées dans le cadre et lire leurs métadonnées. Pour implémenter cette méthode, vous devez créer un lecteur de métadonnées pour chaque bloc de métadonnées et implémenter un objet d’énumération qui énumère la collection de lecteurs de métadonnées. L’objet énumération doit implémenter IEnumUnknown afin que vous puissiez le convertir en IEnumUnknown lorsque vous le retournez dans le paramètre ppIEnumMetadata .

Lors de l’implémentation de l’objet énumération, vous pouvez créer tous les lecteurs de métadonnées lorsque vous créez pour la première fois l’objet IWICMetadataBlockReader ou lorsque vous créez pour la première fois l’objet d’énumération, ou vous pouvez les créer paresseusement à l’intérieur de l’implémentation de la méthode IEnumUnknown::Next . Dans de nombreux cas, il est plus efficace de les créer paresseusement, mais, dans l’exemple suivant, les lecteurs de blocs sont tous créés dans le constructeur pour économiser de l’espace.

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
    ...
}

Pour créer les lecteurs de métadonnées, vous utilisez la méthode CreateMetadataReaderFromContainer . Lorsque vous appelez cette méthode, vous transmettez le GUID du format conteneur dans le paramètre guidContainerFormat . Si vous avez une préférence de fournisseur pour un lecteur de métadonnées, vous pouvez passer le GUID de votre fournisseur préféré dans le paramètre pGuidVendor . Par exemple, si votre entreprise écrit des gestionnaires de métadonnées et que vous souhaitez utiliser les vôtres, le cas échéant, vous pouvez passer le GUID de votre fournisseur. Dans la plupart des cas, vous transmettez simplement la valeur NULL et laissez le système sélectionner le lecteur de métadonnées approprié. Si vous demandez un fournisseur spécifique et qu’un lecteur de métadonnées est installé sur l’ordinateur, WIC retourne le lecteur de ce fournisseur. Toutefois, si le fournisseur demandé n’a pas de lecteur de métadonnées installé sur l’ordinateur et s’il existe un lecteur de métadonnées approprié disponible, ce lecteur sera retourné même s’il ne provient pas du fournisseur préféré. S’il n’existe aucun lecteur de métadonnées sur l’ordinateur pour le type de métadonnées dans le bloc, la fabrique de composants retourne le gestionnaire de métadonnées inconnus, qui traite le bloc de métadonnées comme un objet BLOB (Binary Large Object) et désérialise le bloc de métadonnées du fichier sans aucune tentative d’analyse.

Pour le paramètre dwOptions , effectuez une opération OR entre les options WICPersistOptions appropriées avec les options WICMetadataCreationOptions appropriées. Les options WICPersistOptions décrivent la façon dont votre conteneur est disposé. Little-endian est la valeur par défaut.

enum WICPersistOptions
{   
   WICPersistOptionDefault,
   WICPersistOptionLittleEndian,
   WICPersistOptionBigEndian,
   WICPersistOptionStrictFormat,
   WICPersistOptionNoCacheStream,
   WICPersistOptionPreferUTF8
};

Les options WICMetadataCreationOptions spécifient si vous souhaitez récupérer le UnknownMetadataHandler si aucun lecteur de métadonnées n’est trouvé sur l’ordinateur capable de lire le format de métadonnées d’un bloc particulier. WICMetadataCreationAllowUnknown est la valeur par défaut. Vous devez toujours autoriser la création du UnknownMetadtataHandler. UnknownMetadataHandler traite les métadonnées non reconnues en tant qu’objet BLOB. Il ne peut pas l’analyser, mais il l’écrit dans le flux en tant qu’objet BLOB et le conserve intact lorsqu’il est réécrit dans le flux pendant l’encodage. Cela permet de créer des gestionnaires de métadonnées pour les métadonnées propriétaires ou les formats de métadonnées qui ne sont pas fournis avec le système. Étant donné que les métadonnées sont conservées intactes, même si aucun gestionnaire n’est présent sur l’ordinateur qui les reconnaît, lorsqu’un gestionnaire de métadonnées approprié est installé ultérieurement, les métadonnées sont toujours là et peuvent être lues. Si vous n’autorisez pas la création de UnknownMetadataHandler, l’alternative consiste à ignorer ou à remplacer les métadonnées non reconnues. Il s’agit d’une forme de perte de données.

Notes

Si vous écrivez votre propre gestionnaire de métadonnées pour les métadonnées propriétaires, vous ne devez jamais inclure de références à quelque chose en dehors du bloc de métadonnées lui-même. Même si UnknownMetadataHandler conserve les métadonnées intactes, les métadonnées sont déplacées lorsque des fichiers sont modifiés, et toutes les références à quelque chose en dehors de son propre bloc ne seront plus valides lorsque cela se produit.

 

enum WICMetadataCreationOptions
{
   WICMetadataCreationDefault = 0x00000000,
   WICMetadataCreationAllowUnknown = WICMetadataCreationDefault,
   WICMetadataCreationFailUnknown = 0x00010000,
   WICMetadataCreationMask = 0xFFFF0000
};

Le paramètre pIStream est le flux réel que vous décodez. Avant de passer le flux, vous devez rechercher au début du bloc de métadonnées pour lequel vous demandez un lecteur. Le lecteur de métadonnées approprié pour le bloc de métadonnées à la position actuelle dans IStream sera retourné dans le paramètre ppiReader .

GetReaderByIndex

GetReaderByIndex retourne le lecteur de métadonnées à l’index demandé dans la collection.

Informations de référence

Iwicmetadatablockreader

Conceptuel

Implémentation d’IWICBitmapFrameDecode

Implémentation d’IWICBitmapSourceTransform

Comment écrire un codec WIC-Enabled

Vue d’ensemble du composant d’acquisition d’images Windows