Introducción a los metadatos de WIC

En este tema se presenta la compatibilidad de metadatos de creación de imágenes proporcionada por el componente de creación de imágenes de Windows (WIC). Proporciona una introducción a la lectura y escritura de metadatos de imagen, el lenguaje de consulta de metadatos y la extensibilidad del controlador de metadatos.

Los metadatos de imagen son datos incrustados dentro de un archivo de imagen que proporciona información adicional sobre la imagen, como el dispositivo usado para capturar la imagen o las dimensiones de la imagen. Aunque se encuentra dentro del propio archivo de imagen, estos metadatos no forman parte de los datos de representación. WIC proporciona interfaces que permiten leer y escribir estos metadatos para varios formatos de metadatos comunes, como Extensible Metadata Platform (XMP), Exchangeable Image File (EXIF) y Png Textual Data (tEXt).

En este tema se incluyen las siguientes secciones.

Prerrequisitos

Para comprender este tema, debe estar familiarizado con las interfaces de codificador y descodificador WIC y sus componentes relacionados del Modelo de objetos componentes (COM), tal y como se describe en Información general del componente de imágenes de Windows. También ayuda a tener una familiaridad general con algunos de los formatos de metadatos de creación de imágenes que se usan hoy en día.

Introducción

Los metadatos proporcionan información extendida sobre una imagen. Esta información se puede usar de varias maneras. Una imagen puede contener metadatos como una descripción, clasificación, etiquetas de categoría e información de copyright. El acceso a los metadatos facilita la realización de tareas como la administración de recursos, la ubicación de los archivos o la determinación de la información de copyright. Por ejemplo, la Galería de fotos de Windows en Windows Vista permite agregar descripciones y etiquetas de categoría a imágenes. Esto permite una mejor detectabilidad de imágenes y una manera cómoda de clasificar imágenes. Con las API de WIC y los formatos de metadatos comunes, las aplicaciones pueden escribir o leer fácilmente este tipo de metadatos hacia o desde imágenes.

En el diagrama siguiente se muestra el contenido de un archivo JPEG que incluye bloques de metadatos incrustados y elementos de metadatos.

imagen jpeg con metadatos de clasificación

En esta imagen de ejemplo, los metadatos se incrustan en el archivo de imagen dentro de un marco de imagen. El formato JPEG no admite varios fotogramas de imagen, por lo que los metadatos se adjuntan conceptualmente a este único fotograma. Los formatos que admiten varios fotogramas, como TIFF, pueden tener metadatos adjuntos a cada fotograma de imagen, como se muestra en este diagrama. Aunque no es habitual actualmente y no es compatible con los códecs de imagen nativos, algunos formatos de imagen también pueden admitir metadatos fuera de un marco de imagen. WIC es lo suficientemente flexible como para controlar los metadatos de nivel de fotograma y los metadatos fuera del marco individual de una imagen.

Leer metadatos de imagen

Las API de WIC proporcionan componentes COM que facilitan a las aplicaciones leer y escribir metadatos de imagen.

La forma principal de leer metadatos es usar un lector de consultas de metadatos (IWICMetadataQueryReader) para acceder a elementos de metadatos específicos. El códec implementa el componente de lector de consultas de metadatos y se puede acceder a él en el nivel de descodificador o a través de fotogramas de imagen individuales, que es el método más común. En el código siguiente se muestra cómo obtener acceso a un lector de consultas para un marco individual mediante el método GetMetadataQueryReader del lector de consultas.

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

Un lector de consultas proporciona métodos para obtener información sobre metadatos específicos y un medio para especificar un elemento de metadatos que se va a recuperar. El código siguiente usa una expresión de consulta para solicitar un elemento de metadatos específico dentro del bloque directorio de archivos de imagen anidado (IFD) de App1. Esto se hace mediante el método GetMetadataByName del lector de consultas. En el código siguiente se muestra el uso del lector de consultas para obtener el valor de clasificación de MicrosoftPhoto.

PROPVARIANT value;
PropVariantInit(&value);

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

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

La variable pwzRatingQuery del ejemplo anterior es la cadena de consulta para tener acceso al elemento de metadatos Clasificación de MicrosoftPhoto. Esta cadena se crea mediante el lenguaje de consulta de metadatos. Para crear esta cadena, se necesita el conocimiento del formato de metadatos y el lenguaje de consulta de metadatos para recuperar elementos de metadatos individuales. Para obtener más información sobre el lenguaje de consulta de metadatos, consulte Introducción al lenguaje de consulta de metadatos.

En segundo plano, un lector de consultas usa un lector de metadatos (IWICMetadataReader) para acceder a los metadatos descritos por la expresión de consulta. Además de usar un lector de consultas, también puede acceder a un lector de metadatos directamente para leer los metadatos. Puede obtener un lector de metadatos del descodificador o fotogramas individuales consultando una interfaz de lector de bloques (IWICMetadataBlockReader).

Escribir metadatos de imagen

El proceso de escritura de metadatos es similar a la manera en que se lee, salvo que se usa un escritor de consultas de metadatos (IWICMetadataQueryWriter). El codificador de imágenes implementa la interfaz del escritor de consultas y, como en el lector de consultas, se accede a los metadatos tanto en el codificador como en fotogramas individuales (según la compatibilidad con el formato de imagen).

En el código siguiente se muestra cómo obtener un escritor de consultas de un marco de codificador y quitar el valor de clasificación que se leyó anteriormente.

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

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

Otra manera de escribir metadatos es mediante actualizaciones rápidas de metadatos. La codificación rápida de metadatos es una manera de escribir metadatos de imagen sin tener que volver a codificar un archivo de imagen. Esto se hace escribiendo nueva información de metadatos en una región rellenada del formato de metadatos. El codificador de metadatos rápido (IWICFastMetadataEncoder) se obtiene del generador de componentes, en función del descodificador de imágenes. A continuación, el codificador de metadatos rápido obtiene un escritor de consultas que se usa para escribir los metadatos. Por último, el codificador rápido confirma el cambio.

En el código siguiente se muestra cómo obtener un codificador de metadatos rápido y usarlo para escribir el valor 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();
    }
}

No todos los formatos de metadatos admiten metadatos rápidos. Para ver qué formatos compatibles de forma nativa admiten la codificación rápida de metadatos, consulte la tabla de la sección Formatos de metadatos admitidos más adelante en este documento.

En segundo plano, un escritor de consultas usa un escritor de metadatos (IWICMetadataWriter) para escribir los metadatos descritos por la expresión de consulta. Además de usar un lector de consultas, también puede acceder a un escritor de metadatos directamente para escribir metadatos. Puede obtener un escritor de metadatos del descodificador o fotogramas individuales mediante la consulta de una interfaz de escritor de bloques (IWICMetadataBlockWriter).

Extensibilidad de metadatos

Como se mencionó anteriormente, WIC proporciona varios controladores de metadatos para leer y escribir metadatos para formatos de metadatos comunes. Sin embargo, hay algunos formatos de metadatos que no se admiten de forma nativa. Por lo tanto, WIC proporciona API para crear controladores de metadatos adicionales que pueden ampliar la compatibilidad con metadatos a otros formatos.

Para admitir totalmente otros formatos de metadatos, se deben desarrollar dos tipos de controladores: un lector de metadatos para leer metadatos y un escritor de metadatos para escribir metadatos. Aunque estos dos controladores normalmente se implementan en pares para un formato específico, no es un requisito. Puede haber algunos casos en los que solo se necesite la capacidad de lectura o solo la capacidad de escritura.

Para obtener más información sobre la extensibilidad de metadatos mediante las API de WIC, consulte Introducción a la extensibilidad de metadatos.

Formatos de metadatos admitidos

WIC proporciona compatibilidad con varios formatos de metadatos comunes. En la tabla siguiente se enumeran los formatos de metadatos admitidos, sus versiones, los formatos de imagen que admiten el formato de metadatos y si el formato de metadatos admite la codificación rápida de metadatos. Para obtener más información sobre la codificación rápida de metadatos, consulte la sección Escribir metadatos de imagen anteriormente en este documento.

Formatos de metadatos admitidos Versión de especificación de metadatos Compatibilidad con el formato de imagen Admite la codificación rápida de metadatos
App0 JFIF 1.02 JPEG No
Aplicación 1 JFIF 1.02 JPEG, TIFF No
App13 Desconocido JPEG, TIFF No
IFD TIFF 6.0 JPEG, TIFF
IRB Desconocido JPEG, TIFF No
Exif Exif 2.2 JPEG, TIFF
XMP XMP 1.0 (septiembre de 2005) JPEG, TIFF
GPS Exif 2.2 JPEG, TIFF
IPTC IPTC 4.0 JPEG, TIFF
Texto PNG 1.2 PNG No

 

Nota

IPTC solo admite FME si los bloques crecen en tamaño, ya que IPTC no admite relleno.

 

Resumen de componentes de metadatos

En la tabla siguiente se describen las interfaces WIC que admiten metadatos y sus componentes correspondientes. Estos componentes proporcionan el acceso a los metadatos de una imagen. Para obtener más información sobre estos componentes, consulta Información general del componente de creación de imágenes de Windows.

Componente Descripción
Descodificador de mapa de bits (IWICBitmapDecoder)
  • Lee una secuencia de imagen y genera un origen de mapa de bits utilizable. Asociado a un formato de contenedor, como Formato de archivo de imagen etiquetado (TIFF) o Joint Photographic Experts Group (JPEG).
  • Implementa una interfaz IWICMetadataBlockReader para enumerar todos los bloques de metadatos del flujo de datos del descodificador que no están dentro de un marco.
  • Expone un lector de consultas para leer los metadatos asociados a la imagen que no está dentro de un marco.
Descodificación de fotogramas de mapa de bits (IWICBitmapFrameDecode)
  • Obtiene acceso a fotogramas individuales desde la secuencia de imágenes que mantiene el descodificador.
  • Implementa una interfaz IWICMetadataBlockReader para enumerar todos los bloques de metadatos del flujo de datos del fotograma.
  • Expone un lector de consultas para leer los metadatos asociados al marco mediante expresiones de consulta.
Codificador de mapa de bits (IWICBitmapEncoder)
  • Escribe un origen de mapa de bits en una secuencia de imágenes. Asociado a un formato de contenedor como TIFF o JPEG.
  • Implementa una interfaz IWICMetadataBlockWriter para crear una lista de bloques de metadatos que se van a escribir en el flujo de datos del codificador.
  • Expone un escritor de consultas para escribir los metadatos asociados a la imagen mediante expresiones de consulta.
Codificación de fotogramas bitma (IWICBitmapFrameEncode)
  • Crea un marco que se codificará en la secuencia que mantiene el codificador.
  • Implementa una interfaz IWICMetadataBlockWriter para crear una lista de bloques de metadatos para escribir en el flujo de datos del fotograma.
  • Expone un escritor de consultas para escribir los metadatos asociados al marco mediante expresiones de consulta.

 

En la tabla siguiente se describen los componentes de metadatos de WIC. Estos componentes permiten leer y escribir los metadatos en una imagen expuesta por los componentes enumerados en la tabla anterior.

Componente Descripción
Lector de consultas de metadatos (IWICMetadataQueryReader)
  • Toma una cadena de consulta y navega por la jerarquía de metadatos subyacente para obtener los metadatos.
Escritor de consultas de metadatos (IWICMetadataQueryWriter)
  • Toma una cadena de consulta y navega por la jerarquía de metadatos subyacente para obtener, establecer y quitar metadatos.
Lector de bloques de metadatos (IWICMetadataBlockReader)
  • Administra una colección de solo lectura de objetos IWICMetadataReader en la parte superior de la jerarquía de metadatos y habilita la enumeración de todos los bloques de metadatos.
  • Implementado por un descodificador de mapa de bits y un marco de mapa de bits descodificado.
  • Implementado por desarrolladores de componentes de terceros para códecs personalizados.
Escritor de bloques de metadatos (IWICMetadataBlockWriter)
  • Administra una colección de lectura y escritura de objetos IWICMetadataWriter en la parte superior de la jerarquía de metadatos.
  • Implementado por un codificador de mapa de bits y una codificación de marco de mapa de bits.
  • Implementado por desarrolladores de componentes de terceros para códecs personalizados.
Lector de metadatos (IWICMetadataReader)
  • Analiza un flujo de metadatos y administra una colección de solo lectura de los elementos de metadatos. Asociado a un formato de metadatos como EXIF, IFD y XMP.
  • Actúa como un diccionario y devuelve un valor cuando se le asigna un par de formato e identificador.
  • Implementado por desarrolladores de componentes de terceros para tipos de metadatos personalizados.
Metadata Writer (IWICMetadataWriter)
  • Analiza y serializa un flujo de metadatos y administra una colección de lectura y escritura de elementos de metadatos.
  • Implementado por desarrolladores de componentes de terceros para tipos de metadatos personalizados.
Fast Metadata EncoderIWICFastMetadataEncoder
  • Expone la semántica para escribir en una jerarquía de metadatos que actualizará los metadatos en su lugar sin volver a codificar la imagen.

 

Conceptual

Información general sobre el componente de creación de imágenes de Windows

Introducción al lenguaje de consulta de metadatos

Información general sobre la lectura y escritura de metadatos de imagen

Introducción a la extensibilidad de metadatos

Procedimiento para volver a codificar una imagen JPEG con metadatos