Vue d’ensemble des métadonnées WIC

Cette rubrique présente la prise en charge des métadonnées d’imagerie fournie par le composant d’acquisition d’images Windows (WIC). Il fournit une introduction à la lecture et à l’écriture de métadonnées d’image, au langage de requête de métadonnées et à l’extensibilité du gestionnaire de métadonnées.

Les métadonnées d’image sont des données incorporées dans un fichier image qui fournit des informations supplémentaires sur l’image, telles que l’appareil utilisé pour capturer l’image ou les dimensions de l’image. Bien qu’elles soient contenues dans le fichier image lui-même, ces métadonnées ne font pas partie des données de rendu. WIC fournit des interfaces qui vous permettent de lire et d’écrire ces métadonnées pour plusieurs formats de métadonnées courants, notamment XMP (Extensible Metadata Platform), Exchangeable Image File (EXIF) et Png Textual Data (tEXt).

Cette rubrique contient les sections suivantes.

Prérequis

Pour comprendre cette rubrique, vous devez être familiarisé avec les interfaces d’encodeur et de décodeur WIC et leurs composants COM (Component Object Model) associés, comme décrit dans La vue d’ensemble des composants d’acquisition d’images Windows. Il permet également d’avoir une connaissance générale de certains des formats de métadonnées d’imagerie utilisés aujourd’hui.

Introduction

Les métadonnées fournissent des informations étendues sur une image. Ces informations peuvent être utilisées de plusieurs façons. Une image peut contenir des métadonnées telles qu’une description, une évaluation, des étiquettes de catégorie et des informations de copyright. L’accès aux métadonnées facilite l’exécution de tâches telles que la gestion des ressources, l’emplacement des fichiers ou la détermination des informations de copyright. Par exemple, la Galerie de photos Windows dans Windows Vista vous permet d’ajouter des descriptions et des étiquettes de catégorie aux images. Cela permet une meilleure détectabilité des images et un moyen pratique de catégoriser les images. À l’aide des API WIC et des formats de métadonnées courants, les applications peuvent facilement écrire ou lire ce type de métadonnées vers ou à partir d’images.

Le diagramme suivant illustre le contenu d’un fichier JPEG qui comprend des blocs de métadonnées incorporés et des éléments de métadonnées.

image jpeg avec les métadonnées d’évaluation

Dans cet exemple d’image, les métadonnées sont incorporées dans le fichier image dans un cadre d’image. Le format JPEG ne prend pas en charge plusieurs images. Les métadonnées sont donc attachées à cette image unique. Les formats qui prennent en charge plusieurs images, comme le TIFF, peuvent avoir des métadonnées attachées à chaque image, comme le montre ce diagramme. Bien qu’ils ne soient pas courants aujourd’hui et qu’ils ne soient pas pris en charge par les codecs d’image natifs, certains formats d’image peuvent également prendre en charge les métadonnées en dehors d’un cadre d’image. WIC est suffisamment flexible pour gérer à la fois les métadonnées au niveau de l’image et les métadonnées en dehors du cadre individuel d’une image.

Lecture des métadonnées d’image

Les API WIC fournissent des composants COM qui permettent aux applications de lire et d’écrire facilement des métadonnées d’image.

La principale façon de lire les métadonnées consiste à utiliser un lecteur de requête de métadonnées (IWICMetadataQueryReader) pour accéder à des éléments de métadonnées spécifiques. Le composant lecteur de requête de métadonnées est implémenté par le codec et est accessible au niveau du décodeur ou via des images individuelles, qui est la méthode la plus courante. Le code suivant montre comment accéder à un lecteur de requête pour une trame individuelle à l’aide de la méthode GetMetadataQueryReader du lecteur de requête.

// Get the query reader
if (SUCCEEDED(hr))
{
    hr = pFrameDecode->GetMetadataQueryReader(&pQueryReader);
}

Un lecteur de requête fournit des méthodes pour obtenir des informations sur des métadonnées spécifiques et un moyen de spécifier un élément de métadonnées à récupérer. Le code suivant utilise une expression de requête pour demander un élément de métadonnées spécifique dans le bloc IFD (Nested Image File Directory) App1. Pour ce faire, utilisez la méthode GetMetadataByName du lecteur de requête. Le code suivant illustre l’utilisation du lecteur de requête pour obtenir la valeur d’évaluation MicrosoftPhoto.

PROPVARIANT value;
PropVariantInit(&value);

LPCWSTR pwzRatingQuery = L"/app1/ifd/{ushort=18249}";

if (SUCCEEDED(hr))
{
    hr = pQueryReader->GetMetadataByName(pwzRatingQuery, &value);
}

La variable pwzRatingQuery dans l’exemple précédent est la chaîne de requête pour accéder à l’élément de métadonnées Évaluation MicrosoftPhoto. Cette chaîne est créée à l’aide du langage de requête de métadonnées. Pour créer cette chaîne, une connaissance du format des métadonnées et du langage de requête de métadonnées est nécessaire pour récupérer des éléments de métadonnées individuels. Pour plus d’informations sur le langage de requête de métadonnées, consultez Vue d’ensemble du langage de requête de métadonnées.

En arrière-plan, un lecteur de requête utilise un lecteur de métadonnées (IWICMetadataReader) pour accéder aux métadonnées décrites par l’expression de requête. En plus d’utiliser un lecteur de requête, vous pouvez également accéder directement à un lecteur de métadonnées pour lire les métadonnées. Vous pouvez obtenir un lecteur de métadonnées à partir du décodeur ou d’images individuelles en interrogeant une interface de lecteur de blocs (IWICMetadataBlockReader).

Écriture de métadonnées d’image

Le processus d’écriture des métadonnées est similaire à la façon dont elles sont lues, sauf qu’un enregistreur de requête de métadonnées (IWICMetadataQueryWriter) est utilisé. L’interface de l’enregistreur de requêtes est implémentée par l’encodeur d’image et, comme dans le lecteur de requête, les métadonnées sont accessibles à la fois sur l’encodeur et sur les images individuelles (en fonction de la prise en charge du format d’image).

Le code suivant montre comment obtenir un enregistreur de requêtes à partir d’une trame d’encodeur et supprimer la valeur d’évaluation précédemment lue.

// Get the frame's query writer
if (SUCCEEDED(hr))
{
    hr = pFrameEncode->GetMetadataQueryWriter(&pFrameQWriter);
}

if (SUCCEEDED(hr))
{
    hr = pFrameQWriter->RemoveMetadataByName(L"/app1/ifd/{ushort=18249}");
}

Une autre façon d’écrire des métadonnées consiste à effectuer des mises à jour rapides des métadonnées. L’encodage rapide des métadonnées est un moyen d’écrire des métadonnées d’image sans avoir à réencoder un fichier image. Pour ce faire, écrivez de nouvelles informations de métadonnées dans une région rembourrée du format de métadonnées. L’encodeur de métadonnées rapide (IWICFastMetadataEncoder) est obtenu à partir de la fabrique de composants, en fonction du décodeur d’image. L’encodeur de métadonnées rapide obtient ensuite un enregistreur de requête qui est utilisé pour écrire les métadonnées. Enfin, l’encodeur rapide valide la modification.

Le code suivant montre comment obtenir un encodeur de métadonnées rapide et l’utiliser pour écrire la valeur MicrosoftRating.

if (SUCCEEDED(hr))
{
    IWICFastMetadataEncoder *pFME = NULL;
    IWICMetadataQueryWriter *pFMEQW = NULL;

    hr = pFactory->CreateFastMetadataEncoderFromFrameDecode(
        pFrameDecode,
        &pFME);

    if (SUCCEEDED(hr))
    {
        hr = pFME->GetMetadataQueryWriter(&pFMEQW);
    }

    if (SUCCEEDED(hr))
    {
        // Add additional metadata
        PROPVARIANT value;

        PropVariantInit(&value);

        value.vt = VT_UI4;
        value.uiVal = 99;
        hr = pFMEQW->SetMetadataByName(L"/app1/ifd/{ushort=18249}", &value);

        PropVariantClear(&value);
    }

    if (SUCCEEDED(hr))
    {
        hr = pFME->Commit();
    }
}

Tous les formats de métadonnées ne prennent pas en charge les métadonnées rapides. Pour voir quels formats pris en charge en mode natif prennent en charge l’encodage rapide des métadonnées, consultez le tableau de la section Formats de métadonnées pris en charge plus loin dans ce document.

En arrière-plan, un enregistreur de requêtes utilise un enregistreur de métadonnées (IWICMetadataWriter) pour écrire les métadonnées décrites par l’expression de requête. En plus d’utiliser un lecteur de requête, vous pouvez également accéder directement à un enregistreur de métadonnées pour écrire des métadonnées. Vous pouvez obtenir un enregistreur de métadonnées à partir du décodeur ou des trames individuelles à l’aide de l’interrogation d’un enregistreur de blocs (IWICMetadataBlockWriter).

Extensibilité des métadonnées

Comme mentionné précédemment, WIC fournit plusieurs gestionnaires de métadonnées pour lire et écrire des métadonnées pour les formats de métadonnées courants. Toutefois, certains formats de métadonnées ne sont pas pris en charge en mode natif. Par conséquent, WIC fournit des API pour créer des gestionnaires de métadonnées supplémentaires qui peuvent étendre la prise en charge des métadonnées à d’autres formats.

Pour prendre entièrement en charge d’autres formats de métadonnées, deux types de gestionnaires doivent être développés : un lecteur de métadonnées pour lire les métadonnées et un enregistreur de métadonnées pour écrire des métadonnées. Bien que ces deux gestionnaires soient généralement implémentés par paires pour un format spécifique, ce n’est pas obligatoire. Dans certains cas, seule la capacité de lecture ou seule la capacité d’écriture est nécessaire.

Pour plus d’informations sur l’extensibilité des métadonnées à l’aide des API WIC, consultez Vue d’ensemble de l’extensibilité des métadonnées.

Formats de métadonnées pris en charge

WIC prend en charge plusieurs formats de métadonnées courants. Le tableau suivant répertorie les formats de métadonnées pris en charge, leurs versions, les formats d’image qui prennent en charge le format de métadonnées et indique si le format de métadonnées prend en charge l’encodage rapide des métadonnées. Pour plus d’informations sur l’encodage rapide des métadonnées, consultez la section Écriture des métadonnées d’image plus haut dans ce document.

Formats de métadonnées pris en charge Version de la spécification des métadonnées Prise en charge du format d’image Prend en charge l’encodage rapide des métadonnées
App0 JFIF 1.02 JPEG Non
App1 JFIF 1.02 JPEG, TIFF Non
App13 Unknown JPEG, TIFF Non
IFD TIFF 6.0 JPEG, TIFF Oui
CISR Unknown JPEG, TIFF Non
Exif Exif 2.2 JPEG, TIFF Oui
XMP XMP 1.0 (septembre 2005) JPEG, TIFF Oui
GPS Exif 2.2 JPEG, TIFF Oui
IPTC IPTC 4.0 JPEG, TIFF Oui
Texte PNG 1.2 PNG Non

 

Notes

IPTC prend uniquement en charge FME si la taille des blocs augmente, car IPTC ne prend pas en charge le remplissage.

 

Résumé du composant de métadonnées

Le tableau suivant décrit les interfaces WIC qui prennent en charge les métadonnées et leurs composants correspondants. Ces composants fournissent l’accès aux métadonnées d’une image. Pour plus d’informations sur ces composants, consultez vue d’ensemble du composant d’acquisition d’images Windows.

Composant Description
Bitmap Decoder (IWICBitmapDecoder)
  • Lit un flux d’image et produit une source bitmap utilisable. Associé à un format conteneur tel que TIFF (Tagged Image File Format) ou JPEG (Joint Photographic Experts Group).
  • Implémente une interface IWICMetadataBlockReader pour énumérer tous les blocs de métadonnées dans le flux de données du décodeur qui ne se trouvent pas dans un cadre.
  • Expose un lecteur de requête pour lire les métadonnées associées à l’image qui ne se trouve pas à l’intérieur d’un cadre.
Bitmap Frame Decode (IWICBitmapFrameDecode)
  • Accède à des images individuelles à partir du flux d’image détenu par le décodeur.
  • Implémente une interface IWICMetadataBlockReader pour énumérer tous les blocs de métadonnées dans le flux de données du frame.
  • Expose un lecteur de requête pour lire les métadonnées associées au frame, à l’aide d’expressions de requête.
Bitmap Encoder (IWICBitmapEncoder)
  • Écrit une source bitmap dans un flux d’images. Associé à un format de conteneur tel que TIFF ou JPEG.
  • Implémente une interface IWICMetadataBlockWriter pour créer une liste de blocs de métadonnées à écrire dans le flux de données de l’encodeur.
  • Expose un enregistreur de requêtes pour écrire les métadonnées associées à l’image, à l’aide d’expressions de requête.
Bitma Frame Encode (IWICBitmapFrameEncode)
  • Crée un frame qui sera encodé dans le flux détenu par l’encodeur.
  • Implémente une interface IWICMetadataBlockWriter pour créer une liste de blocs de métadonnées à écrire dans le flux de données du frame.
  • Expose un enregistreur de requêtes pour écrire les métadonnées associées au frame, à l’aide d’expressions de requête.

 

Le tableau suivant décrit les composants de métadonnées WIC. Ces composants vous permettent de lire et d’écrire les métadonnées dans une image exposée par les composants répertoriés dans le tableau précédent.

Composant Description
Lecteur de requête de métadonnées (IWICMetadataQueryReader)
  • Prend une chaîne de requête et navigue dans la hiérarchie de métadonnées sous-jacente pour obtenir les métadonnées.
Enregistreur de requêtes de métadonnées (IWICMetadataQueryWriter)
  • Prend une chaîne de requête et navigue dans la hiérarchie de métadonnées sous-jacente pour obtenir, définir et supprimer des métadonnées.
Lecteur de blocs de métadonnées (IWICMetadataBlockReader)
  • Gère une collection en lecture seule d’objets IWICMetadataReader en haut de la hiérarchie de métadonnées et active l’énumération de tous les blocs de métadonnées.
  • Implémenté par un décodeur bitmap et un frame bitmap décodé.
  • Implémenté par les développeurs de composants tiers pour les codecs personnalisés.
Enregistreur de blocs de métadonnées (IWICMetadataBlockWriter)
  • Gère une collection en lecture et en écriture d’objets IWICMetadataWriter en haut de la hiérarchie de métadonnées.
  • Implémenté par un encodeur bitmap et un encodeur de trame bitmap.
  • Implémenté par les développeurs de composants tiers pour les codecs personnalisés.
Lecteur de métadonnées (IWICMetadataReader)
  • Analyse un flux de métadonnées et gère une collection en lecture seule des éléments de métadonnées. Associé à un format de métadonnées tel que EXIF, IFD et XMP.
  • Agit comme un dictionnaire, renvoyant une valeur lorsqu’une paire de format et d’ID est donnée.
  • Implémenté par les développeurs de composants tiers pour les types de métadonnées personnalisés.
Enregistreur de métadonnées (IWICMetadataWriter)
  • Analyse et sérialise un flux de métadonnées et gère une collection en lecture/écriture d’éléments de métadonnées.
  • Implémenté par les développeurs de composants tiers pour les types de métadonnées personnalisés.
Fast Metadata EncoderIWICFastMetadataEncoder
  • Expose la sémantique pour l’écriture sur une hiérarchie de métadonnées qui met à jour les métadonnées en place sans réécodage de l’image.

 

Conceptuel

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

Vue d’ensemble du langage de requête de métadonnées

Vue d’ensemble de la lecture et de l’écriture de métadonnées d’image

Vue d’ensemble de l’extensibilité des métadonnées

Procédure : réencoder une image JPEG avec des métadonnées