Introducción a la extensibilidad de metadatos

En este tema se presentan los requisitos para crear controladores de metadatos personalizados para el componente de creación de imágenes de Windows (WIC), incluidos los lectores de metadatos y los escritores. También se describen los requisitos para extender la detección de componentes en tiempo de ejecución de WIC para incluir los controladores de metadatos personalizados.

En este tema se incluyen las siguientes secciones.

Prerrequisitos

Para comprender este tema, debe tener una comprensión detallada de WIC, sus componentes y metadatos para las imágenes. Para obtener más información sobre los metadatos de WIC, consulte introducción a los metadatos de WIC. Para obtener más información sobre los componentes de WIC, consulta Información general sobre componentes de creación de imágenes de Windows.

Introducción

Como se describe en la introducción a los metadatos de WIC, a menudo hay varios bloques de metadatos dentro de una imagen, cada uno de los cuales expone diferentes tipos de información en diferentes formatos de metadatos. Para interactuar con un formato de metadatos incrustado dentro de una imagen, una aplicación debe usar un controlador de metadatos adecuado. WIC proporciona varios controladores de metadatos (lectores de metadatos y escritores) que permiten leer y escribir tipos específicos de metadatos, como Exif o XMP.

Además de los controladores nativos proporcionados, WIC proporciona API que permiten crear nuevos controladores de metadatos que participan en la detección de componentes en tiempo de ejecución de WIC. Esto permite que las aplicaciones que usan WIC lean y escriban los formatos de metadatos personalizados.

Los pasos siguientes permiten que los controladores de metadatos participen en la detección de metadatos en tiempo de ejecución de WIC.

  • Implemente una clase de controlador de lector de metadatos (IWICMetadataReader) que exponga las interfaces WIC necesarias para leer el formato de metadatos personalizado. Esto permite a las aplicaciones basadas en WIC leer el formato de metadatos de la misma manera que leen formatos de metadatos nativos.
  • Implemente una clase de controlador de escritor de metadatos (IWICMetadataWriter) que exponga las interfaces WIC necesarias para codificar el formato de metadatos personalizado. Esto permite a las aplicaciones basadas en WIC serializar el formato de metadatos en formatos de imagen admitidos.
  • Firmar y registrar digitalmente los controladores de metadatos. Esto permite que los controladores de metadatos se detecten en tiempo de ejecución mediante la coincidencia del patrón de identificación en el registro con el patrón incrustado en el archivo de imagen.

Crear un lector de metadatos

El acceso principal a los bloques de metadatos dentro de un códec es a través de la interfaz IWICMetadataBlockReader que implementa cada códec WIC. Esta interfaz enumera cada uno de los bloques de metadatos incrustados en un formato de imagen para que se pueda detectar y crear instancias del controlador de metadatos adecuado para cada bloque. Los bloques de metadatos que wiC no reconoce se consideran desconocidos y se definen como guid CLSID_WICUnknownMetadataReader. Para que WIC reconozca el formato de metadatos, debe crear una clase que implemente tres interfaces: IWICMetadataReader, IWICPersistStream e IWICStreamProvider.

Nota

Si el formato de metadatos tiene restricciones que representan algunos métodos de las interfaces necesarias inapropiadas, estos métodos deben devolver WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Interfaz IWICMetadataReader

La interfaz IWICMetadataReader debe implementarse al crear un lector de metadatos. Esta interfaz proporciona acceso a los elementos de metadatos de subling dentro del flujo de datos de un formato de metadatos.

En el código siguiente se muestra la definición de la interfaz de lector de metadatos tal como se define en el archivo wincodecsdk.idl.

interface IWICMetadataReader : IUnknown
{
    HRESULT GetMetadataFormat(
        [out] GUID *pguidMetadataFormat
        );

    HRESULT GetMetadataHandlerInfo(
        [out] IWICMetadataHandlerInfo **ppIHandler
        );

    HRESULT GetCount(
        [out] UINT *pcCount
        );

    HRESULT GetValueByIndex(
        [in] UINT nIndex,
        [in, out, unique] PROPVARIANT *pvarSchema,
        [in, out, unique] PROPVARIANT *pvarId,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetEnumerator(
        [out] IWICEnumMetadataItem **ppIEnumMetadata
        );
};

El método GetMetadataFormat devuelve el GUID del formato de metadatos.

El método GetMetadataHandlerInfo devuelve una interfaz IWICMetadataHandlerInfo que proporciona información sobre el controlador de metadatos. Esto incluye información como qué formatos de imagen admiten el formato de metadatos y si el lector de metadatos requiere acceso al flujo de metadatos completo.

El método GetCount devuelve el número de elementos de metadatos individuales (incluidos los bloques de metadatos incrustados) que se encuentran dentro del flujo de metadatos.

El método GetValueByIndex devuelve un elemento de metadatos por un valor de índice. Este método permite a las aplicaciones recorrer en bucle cada elemento de metadatos de un bloque de metadatos. En el código siguiente se muestra cómo una aplicación puede usar este método para recuperar cada elemento de metadatos de un bloque de metadatos.

PROPVARIANT readerValue;
IWICMetadataBlockReader *blockReader = NULL;
IWICMetadataReader *reader = NULL;

PropVariantInit(&readerValue);

hr = pFrameDecode->QueryInterface(IID_IWICMetadataBlockReader, (void**)&blockReader);

if (SUCCEEDED(hr))
{
    // Retrieve the third block in the image. This is image specific and
    // ideally you should call this by retrieving the reader count
    // first.
    hr = blockReader->GetReaderByIndex(2, &reader);
}

if (SUCCEEDED(hr))
{
    UINT numValues = 0;

    hr = reader->GetCount(&numValues);

    // Loop through each item and retrieve by index
    for (UINT i = 0; SUCCEEDED(hr) && i < numValues; i++)
    {
        PROPVARIANT id, value;

        PropVariantInit(&id);
        PropVariantInit(&value);

        hr = reader->GetValueByIndex(i, NULL, &id, &value);

        if (SUCCEEDED(hr))
        {
            // Do something with the metadata item.
            //...
        }
        PropVariantClear(&id);
        PropVariantClear(&value);
    }               
}

El método GetValue recupera un elemento de metadatos específico por esquema o identificador. Este método es similar al método GetValueByIndex , salvo que recupera un elemento de metadatos que tiene un esquema o un identificador específicos.

El método GetEnumerator devuelve un enumerador de cada elemento de metadatos del bloque de metadatos. Esto permite a las aplicaciones usar un enumerador para navegar por el formato de metadatos.

Si el formato de metadatos no tiene una noción de esquemas para los elementos de metadatos, GetValue... Los métodos deben omitir esta propiedad. Sin embargo, si el formato admite la nomenclatura del esquema, debe prever un valor NULL .

Si un elemento de metadatos es un bloque de metadatos incrustado, cree un controlador de metadatos a partir de la substream del contenido incrustado y devuelva el nuevo controlador de metadatos. Si no hay ningún lector de metadatos disponible para el bloque anidado, cree una instancia y devuelva un lector de metadatos desconocido. Para crear un nuevo lector de metadatos para el bloque incrustado, llame a los métodos CreateMetadataReaderFromContainer o CreateMetadataReader de la fábrica de componentes, o llame a la función WICMatchMetadataContent .

Si la secuencia de metadatos contiene contenido big-endian, el lector de metadatos es responsable de intercambiar los valores de datos que procesa. También es responsable de informar a los lectores de metadatos anidados que están trabajando con el flujo de datos big-endian. Sin embargo, todos los valores deben devolverse en formato little-endian.

Implemente la compatibilidad con la navegación del espacio de nombres al admitir consultas en las que el identificador del elemento de metadatos es un VT_CLSID (GUID) correspondiente a un formato de metadatos. Si se identifica un lector de metadatos anidado para ese formato durante el análisis, se debe devolver. Esto permite a las aplicaciones usar un lector de consultas de metadatos para buscar en el formato de metadatos.

Al obtener un elemento de metadatos por identificador, debe usar la función PropVariantChangeType para convertir el identificador en el tipo esperado. Por ejemplo, el lector IFD coercerá un identificador para escribir VT_UI2 para que coincida con el tipo de datos de un id. de etiqueta IFD USHORT. El tipo de entrada y el tipo esperado deben ser PROPVARIANT para hacerlo. Esto no es necesario, pero hacer esta coerción simplifica el código que llama al lector para consultar los elementos de metadatos.

Interfaz IWICPersistStream

La interfaz IWICPersistStream hereda de IPersistStream y proporciona métodos adicionales para guardar y cargar objetos mediante la enumeración WICPersistOptions .

El código siguiente muestra la definición de la interfaz IWICPersistStream tal como se define en el archivo wincodecsdk.idl.

interface IWICPersistStream : IPersistStream
{
    HRESULT LoadEx(
        [in, unique] IStream *pIStream,
        [in, unique] const GUID *pguidPreferredVendor,
        [in] DWORD dwPersistOptions
        );

    HRESULT SaveEx(
        [in] IStream *pIStream,
        [in] DWORD dwPersistOptions,
        [in] BOOL fClearDirty
        );
};

El método LoadEx proporciona al lector de metadatos un flujo de datos que contiene el bloque de metadatos. El lector analiza esta secuencia para acceder a los elementos de metadatos subyacentes. El lector de metadatos se inicializa con una substream que se coloca al principio del contenido de metadatos sin procesar. Si el lector no requiere la secuencia completa, la substream se limita en intervalo solo al contenido del bloque de metadatos; De lo contrario, el flujo de metadatos completo se proporciona con la posición establecida al principio del bloque de metadatos.

Los escritores de metadatos usan el método SaveEx para serializar el bloque de metadatos. Cuando Se usa SaveEx en un lector de metadatos, debe devolver WINCODEC_ERR_UNSUPPORTEDOPERATION.

Interfaz IWICStreamProvider

La interfaz IWICStreamProvider permite al lector de metadatos proporcionar referencias a su flujo de contenido, proporcionar información sobre la secuencia y actualizar las versiones almacenadas en caché de la secuencia.

El código siguiente muestra la definición de la interfaz IWICStreamProvider tal como se define en el archivo wincodecsdk.idl.

interface IWICStreamProvider : IUnknown
{
    HRESULT GetStream(
        [out] IStream **ppIStream
        );

    HRESULT GetPersistOptions(
        [out] DWORD *pdwPersistOptions
        );

    HRESULT GetPreferredVendorGUID(
        [out] GUID *pguidPreferredVendor
        );

    HRESULT RefreshStream(
        );
};

El método GetStream recupera una referencia al flujo de metadatos. La secuencia que se devuelve debe tener el puntero de secuencia restablecido a la posición inicial. Si el formato de metadatos requiere acceso de flujo completo, la posición inicial debe ser el inicio del bloque de metadatos.

El método GetPersistOptions devuelve las opciones actuales de la secuencia de la enumeración WICPersistOptions .

El método GetPreferredVendorGUID devuelve el GUID del proveedor del lector de metadatos.

El método RefreshStream actualiza el flujo de metadatos. Este método debe llamar a LoadEx con una secuencia NULL para los bloques de metadatos anidados. Esto es necesario porque es posible que los bloques de metadatos anidados y sus elementos ya no existan, debido a la edición en contexto.

Creación de un escritor de metadatos

Un escritor de metadatos es un tipo de controlador de metadatos que proporciona una manera de serializar un bloque de metadatos en un marco de imagen o fuera de un marco individual si el formato de imagen lo admite. El acceso principal a los escritores de metadatos dentro de un códec es a través de la interfaz IWICMetadataBlockWriter que implementa cada codificador WIC. Esta interfaz permite a las aplicaciones enumerar cada uno de los bloques de metadatos incrustados en una imagen para que se pueda detectar y crear instancias del escritor de metadatos adecuado para cada bloque de metadatos. Los bloques de metadatos que no tienen un escritor de metadatos correspondiente se consideran desconocidos y se definen como el GUID CLSID_WICUnknownMetadataReader. Para permitir que las aplicaciones habilitadas para WIC serialicen y escriban el formato de metadatos, debe crear una clase que implemente las siguientes interfaces: IWICMetadataWriter, IWICMetadataReader, IWICPersistStream e IWICStreamProvider.

Nota

Si el formato de metadatos tiene restricciones que representan algunos métodos de las interfaces necesarias inapropiadas, estos métodos deben devolver WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

IWICMetadataWriter (interfaz)

El escritor de metadatos debe implementar la interfaz IWICMetadataWriter . Además, dado que IWICMetadataWriter hereda de IWICMetadataReader, también debe implementar todos los métodos de IWICMetadataReader. Dado que ambos tipos de controlador requieren la misma herencia de interfaz, es posible que desee crear una sola clase que proporcione funcionalidad de lectura y escritura.

En el código siguiente se muestra la definición de la interfaz del escritor de metadatos tal como se define en el archivo wincodecsdk.idl.

interface IWICMetadataWriter : IWICMetadataReader
{
    HRESULT SetValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in] const PROPVARIANT *pvarValue
        );

    HRESULT SetValueByIndex(
        [in] UINT nIndex,
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in] const PROPVARIANT *pvarValue
        );

    HRESULT RemoveValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId
        );

    HRESULT RemoveValueByIndex(
        [in] UINT nIndex
        );
};

El método SetValue escribe el elemento de metadatos especificado en el flujo de metadatos.

El método SetValueByIndex escribe el elemento de metadatos especificado en el índice especificado en el flujo de metadatos. El índice no hace referencia al identificador, sino a la posición del elemento dentro del bloque de metadatos.

El método RemoveValue quita el elemento de metadatos especificado del flujo de metadatos.

El método RemoveValueByIndex quita el elemento de metadatos en el índice especificado de la secuencia de metadatos. Después de quitar un elemento, se espera que los elementos de metadatos restantes ocupen el índice vacío si el índice no es el último índice. También se espera que el recuento cambie después de quitar el elemento.

Es responsabilidad del escritor de metadatos convertir los elementos PROPVARIANT a la estructura subyacente requerida por el formato. Sin embargo, a diferencia del lector de metadatos, los tipos VARIANT normalmente no se deben coercir a tipos diferentes, ya que el autor de la llamada indica específicamente qué tipo de datos usar.

El escritor de metadatos debe confirmar todos los elementos de metadatos en la secuencia de imágenes, incluidos los valores ocultos o no reconocidos. Esto incluye bloques de metadatos anidados desconocidos. Sin embargo, es responsabilidad del codificador establecer los elementos de metadatos críticos antes de iniciar la operación de guardado.

Si el flujo de metadatos contiene contenido big-endian, el escritor de metadatos es responsable de intercambiar los valores de datos que procesa. También es responsable de informar a los escritores de metadatos anidados que están trabajando con un flujo de datos big-endian cuando se guardan.

Implemente la compatibilidad con la creación y eliminación del espacio de nombres mediante la compatibilidad con operaciones de establecimiento y eliminación de elementos de metadatos con un tipo de VT_CLSID (UN GUID) correspondiente a un formato de metadatos. El escritor de metadatos llama a la función WICSerializeMetadataContent para insertar correctamente el contenido del escritor de metadatos anidado en el escritor de metadatos primario.

Si el formato de metadatos admite la codificación local, es responsable de administrar el relleno necesario. Para obtener más información sobre la codificación local, consulte Introducción a los metadatos de WIC e Información general sobre la lectura y escritura de metadatos de imagen.

IWICPersistStream (interfaz)

La interfaz IWICPersistStream hereda de IPersistStream y proporciona métodos adicionales para guardar y cargar objetos mediante la enumeración WICPersistOptions .

El código siguiente muestra la definición de la interfaz IWICPersistStream tal como se define en el archivo wincodecsdk.idl.

interface IWICPersistStream : IPersistStream
{
    HRESULT LoadEx(
        [in, unique] IStream *pIStream,
        [in, unique] const GUID *pguidPreferredVendor,
        [in] DWORD dwPersistOptions
        );

    HRESULT SaveEx(
        [in] IStream *pIStream,
        [in] DWORD dwPersistOptions,
        [in] BOOL fClearDirty
        );
};

El método LoadEx proporciona al controlador de metadatos un flujo de datos que contiene el bloque de metadatos.

El método SaveEx serializa los metadatos en una secuencia. Si la secuencia proporcionada es la misma que la secuencia de inicialización, debe realizar la codificación en contexto. Si se admite la codificación en contexto, este método debe devolver WINCODEC_ERR_TOOMUCHMETADATA cuando no haya suficiente relleno para realizar la codificación local. Si no se admite la codificación local, este método debe devolver WINCODEC_ERR_UNSUPPORTEDOPERATION.

El método IPersistStream::GetSizeMax debe implementarse y debe devolver el tamaño exacto del contenido de metadatos que se escribiría en el guardado posterior.

El método IPersistStream::IsDirty debe implementarse si el escritor de metadatos se inicializa a través de una secuencia, de modo que una imagen pueda determinar de forma confiable si su contenido ha cambiado.

Si el formato de metadatos admite bloques de metadatos anidados, el escritor de metadatos debe delegar a los escritores de metadatos anidados la serialización de su contenido al guardar en una secuencia.

Interfaz IWICStreamProvider

La implementación de la interfaz IWICStreamProvider para un escritor de metadatos es la misma que la de un lector de metadatos. Para obtener más información, vea la sección Crear un lector de metadatos en este documento.

Instalación y registro de un controlador de metadatos

Para instalar un controlador de metadatos, debe proporcionar el ensamblado del controlador y registrarlo en el registro del sistema. Puede decidir cómo y cuándo se rellenan las claves del Registro.

Nota

Para mayor legibilidad, los GUID hexadecimales reales no se muestran en las claves del Registro que se muestran en las secciones siguientes de este documento. Para buscar el valor hexadecimal de un nombre descriptivo especificado, consulte los archivos wincodec.idl y wincodecsdk.idl.

 

Claves del Registro del controlador de metadatos

Cada controlador de metadatos se identifica mediante un CLSID único y cada controlador es necesario para registrar su CLSID en el GUID del identificador de categoría del controlador de metadatos. Cada identificador de categoría del tipo de controlador se define en wincodec.idl; el nombre del identificador de categoría para los lectores es CATID_WICMetadataReader y el nombre del identificador de categoría para escritores es CATID_WICMetadataWriter.

Cada controlador de metadatos se identifica mediante un CLSID único y cada controlador es necesario para registrar su CLSID en el GUID del identificador de categoría del controlador de metadatos. Cada identificador de categoría del tipo de controlador se define en wincodec.idl; el nombre del identificador de categoría para los lectores es CATID_WICMetadataReader y el nombre del identificador de categoría para escritores es CATID_WICMetadataWriter.

Nota

En las siguientes listas de claves del Registro, {Reader CLSID} hace referencia al CLSID único que proporcione para el lector de metadatos. {Writer CLSID} hace referencia al CLSID único que se proporciona para el escritor de metadatos. {CLSID del controlador} hace referencia al CLSID del lector, el CLSID del escritor o ambos, en función de los controladores que proporcione. {GUID de contenedor} hace referencia al objeto contenedor (formato de imagen o formato de metadatos) que puede contener el bloque de metadatos.

 

Las siguientes claves del Registro registran el controlador de metadatos con los demás controladores de metadatos disponibles:

[HKEY_CLASSES_ROOT\CLSID\{CATID_WICMetadataReaders}\Instance\{Reader CLSID}]
CLSID={Reader CLSID}
Friendly Name="Reader Name"

[HKEY_CLASSES_ROOT\CLSID\{CATID_ WICMetadataWriters}\Instance\{Writer CLSID}]
CLSID={Writer CLSID}
Friendly Name="Writer Name"

Además de registrar los controladores en sus respectivas categorías, también debe registrar claves adicionales que proporcionen información específica para el controlador. Los lectores y escritores comparten requisitos de clave del Registro similares. La sintaxis siguiente muestra cómo registrar un controlador. Tanto el controlador de lector como el controlador de escritura deben registrarse de esta manera, con sus respectivos CLSID:

[HKEY_CLASSES_ROOT\CLSID\{CLSID}]
"Vendor"={VendorGUID}
"Date"="yyyy-mm-dd"
"Version"="Major.Minor.Build.Number"
"SpecVersion"="Major.Minor.Build.Number"
"MetadataFormat"={MetadataFormatGUID}
"RequiresFullStream"=dword:1|0
"SupportsPadding"= dword:1|0
"FixedSize"=0

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\InProcServer32]
@="drive:\path\yourdll.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\{LCID}]
Author="Author's Name"
Description = " Metadata Description"
DeviceManufacturer ="Manufacturer Name"
DeviceModels="Device,Device"
FriendlyName="Friendly Name"

Lectores de metadatos

El registro del lector de metadatos también incluye claves que describen cómo se puede insertar el lector en un formato de contenedor. Un formato de contenedor puede ser un formato de imagen como TIFF o JPEG; también puede ser otro formato de metadatos, como un bloque de metadatos IFD. Los formatos de contenedor de imágenes admitidos de forma nativa se muestran en wincodec.idl; cada formato de contenedor de imágenes se define como un GUID con un nombre que comienza por GUID_ContainerFormat. Los formatos de contenedor de metadatos admitidos de forma nativa se enumeran en wincodecsdk.idl; cada formato de contenedor de metadatos se define como un GUID con un nombre que comienza por GUID_MetadataFormat.

Las claves siguientes registran un contenedor que admite el lector de metadatos y los datos necesarios para leer desde ese contenedor. Cada contenedor admitido por el lector debe registrarse de esta manera.

[HKEY_CLASSES_ROOT\CLSID\{Reader CLSID}\Containers\{Container GUID}\0]
"Position"=dword:00000000
"Pattern"=hex:ff,ff,ff,...
"Mask"=hex:ff,ff,ff,...
"DataOffset"=dword:00000006

La clave Patrón describe el patrón binario que se usa para hacer coincidir el bloque de metadatos con el lector. Al definir un patrón para el lector de metadatos, debe ser lo suficientemente confiable que una coincidencia positiva significa que el lector de metadatos puede comprender los metadatos en el bloque de metadatos que se está procesando.

La clave DataOffset describe el desplazamiento fijo de los metadatos del encabezado de bloque. Esta clave es opcional y, si no se especifica, significa que los metadatos reales no se pueden ubicar mediante un desplazamiento fijo desde el encabezado de bloque.

Escritores de metadatos

El registro del escritor de metadatos también incluye claves que describen cómo escribir el encabezado que precede al contenido de metadatos insertado en un formato de contenedor. Al igual que con el lector, un formato de contenedor puede ser un formato de imagen u otro bloque de metadatos.

Las claves siguientes registran un contenedor que admite el escritor de metadatos y los datos necesarios para escribir el encabezado y los metadatos. Cada contenedor admitido por el escritor debe registrarse de esta manera.

[HKEY_CLASSES_ROOT\CLSID\{Writer CLSID}\Containers\{Container GUID}]
"WritePosition"=dword:00000000
"WriteHeader"=hex:ff,ff,ff,...
"WriteOffset"=dword:00000000

La clave WriteHeader describe el patrón binario del encabezado de bloque de metadatos que se va a escribir. Este patrón binario coincide con la clave pattern del lector del formato de metadatos.

La clave WriteOffset describe el desplazamiento fijo del encabezado de bloque en el que se deben escribir los metadatos. Esta clave es opcional y, si no se especifica, significa que los metadatos reales no deben escribirse con el encabezado .

Firma de un controlador de metadatos

Todos los controladores de metadatos deben estar firmados digitalmente para participar en el proceso de detección de WIC. WIC no cargará ningún controlador que no esté firmado por una entidad de certificación de confianza. Para obtener más información sobre la firma digital, consulte Introducción a la firma de código.

Consideraciones especiales

En las secciones siguientes se incluye información adicional que debe tener en cuenta al crear sus propios controladores de metadatos.

PROPVARIANTS

WIC usa un PROPVARIANT para representar un elemento de metadatos tanto para lectura como para escritura. Un PROPVARIANT proporciona un tipo de datos y un valor de datos para un elemento de metadatos usado en un formato de metadatos. Como escritor de un controlador de metadatos, tiene mucha flexibilidad sobre cómo se almacenan los datos en el formato de metadatos y cómo se representan los datos dentro de un bloque de metadatos. En la tabla siguiente se proporcionan instrucciones para ayudarle a decidir sobre el tipo PROPVARIANT adecuado que se va a usar en diferentes situaciones.

El tipo de metadatos es... Uso del tipo PROPVARIANT PROPVARIANT (propiedad)
Vacío o inexistente. VT_EMPTY No es aplicable.
Sin definir. VT_BLOB Use la propiedad blob para establecer el tamaño y el puntero en el objeto BLOB asignado mediante CoTaskMemAlloc.
Un bloque de metadatos. VT_UNKNOWN Este tipo usa la propiedad punkVal.
Matriz de tipos. VT_VECTOR | VT_{type} Use la propiedad ca{type} para establecer el recuento y el puntero en la matriz asignada mediante CoTaskMemAlloc.
Matriz de bloques de metadatos. VT_VECTOR | VT_VARIANT Utilice la propiedad capropvar para establecer la matriz de variantes.
Valor racional con signo. VT_I8 Utilice la propiedad hVal para establecer el valor. Establezca la palabra alta en el denominador y la palabra baja en el numerador.
Un valor racional. VT_UI8 Utilice la propiedad uhVal para establecer el valor. Establezca HighPart en el denominador y lowPart en el numerador. Tenga en cuenta que LowPart es un entero sin signo. El numerador se debe convertir de un entero sin signo a un valor int para asegurarse de que el bit de signo se conserva si está presente.

 

Para evitar redundancia en la representación de elementos de matriz, no utilice matrices seguras; use solo matrices simples. Esto reduce el trabajo que una aplicación debe realizar al interpretar los tipos PROPVARIANT .

Evite usar VT_BYREF y almacenar valores insertados siempre que sea posible. VT_BYREF es ineficaz para los tipos pequeños (comunes para los elementos de metadatos) y no proporciona información de tamaño.

Antes de usar un PROPVARIANT, llame siempre a PropVariantInit para inicializar el valor. Cuando haya terminado con propvariant, llame siempre a PropVariantClear para liberar cualquier memoria asignada para la variable.

Controladores 8BIM

Al escribir un controlador de metadatos para un bloque de metadatos 8BIM, debe usar una firma que encapsula la firma 8BIM y el identificador. Por ejemplo, el lector de metadatos 8BIMIPTC nativo proporciona la siguiente información del Registro para la detección de lectores:

[HKEY_CLASSES_ROOT\CLSID\{0010668C-0801-4DA6-A4A4-826522B6D28F}\Containers\{16100D66-8570-4BB9-B92D-FDA4B23ECE67}\0]
"Position"=dword:00000000
"Pattern"=hex:38,42,49,4d,04,04
"Mask"=hex:ff,ff,ff,ff,ff,ff
"DataOffset"=dword:00000006

El lector 8BIMIPTC tiene un patrón registrado de 0x38, 0x42, 0x49, 0x4D, 0x04, 0x04. Los cuatro primeros bytes (0x38, 0x42, 0x49, 0x4D) son la firma 8BIM y los dos últimos bytes (0x04, 0x04) son el identificador del registro IPTC.

Por lo tanto, para escribir un lector de metadatos 8BIM para obtener información de resolución, necesitaría un patrón registrado de 0x38, 0x42, 0x49, 0x4D, 0x03, 0xED. De nuevo, los cuatro primeros bytes (0x38, 0x42, 0x49, 0x4D) son la firma 8BIM. Los dos últimos bytes (0x03, 0xED), sin embargo, son el identificador de información de resolución tal y como se define en el formato PSD.

Conceptual

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

Introducción a los metadatos de WIC

Introducción al lenguaje de consulta de metadatos

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

Procedimiento para volver a codificar una imagen JPEG con metadatos

Otros recursos

Cómo escribir un CÓDEC de WIC-Enabled