Condividi tramite


Panoramica dell'estendibilità dei metadati

Questo argomento presenta i requisiti per la creazione di gestori di metadati personalizzati per windows Imaging Component (WIC), inclusi lettori di metadati e writer. Illustra anche i requisiti per estendere l'individuazione dei componenti di runtime wic per includere i gestori di metadati personalizzati.

In questo argomento sono contenute le sezioni seguenti.

Prerequisiti

Per comprendere questo argomento, è necessario avere una conoscenza approfondita di WIC, dei relativi componenti e metadati per le immagini. Per altre informazioni sui metadati WIC, vedere La panoramica dei metadati WIC. Per altre informazioni sui componenti WIC, vedere Panoramica del componente Windows Imaging.

Introduzione

Come illustrato nella panoramica dei metadati wic, spesso esistono più blocchi di metadati all'interno di un'immagine, ognuno dei quali espone diversi tipi di informazioni in formati di metadati diversi. Per interagire con un formato di metadati incorporato in un'immagine, un'applicazione deve usare un gestore di metadati appropriato. WIC offre diversi gestori di metadati (lettori di metadati e writer) che consentono di leggere e scrivere tipi specifici di metadati, ad esempio Exif o XMP.

Oltre ai gestori nativi forniti, WIC fornisce API che consentono di creare nuovi gestori di metadati che partecipano all'individuazione dei componenti in fase di esecuzione di WIC. Ciò consente alle applicazioni che usano WIC di leggere e scrivere i formati di metadati personalizzati.

I passaggi seguenti consentono ai gestori di metadati di partecipare all'individuazione dei metadati in fase di esecuzione di WIC.

  • Implementare una classe del gestore del lettore di metadati (IWICMetadataReader) che espone le interfacce WIC necessarie per la lettura del formato di metadati personalizzato. In questo modo, le applicazioni basate su WIC possono leggere il formato dei metadati nello stesso modo in cui leggono i formati di metadati nativi.
  • Implementare una classe del gestore del writer di metadati (IWICMetadataWriter) che espone le interfacce WIC necessarie per la codifica del formato di metadati personalizzato. Ciò consente alle applicazioni basate su WIC di serializzare il formato dei metadati in formati di immagine supportati.
  • Firmare digitalmente e registrare i gestori di metadati. In questo modo i gestori di metadati possono essere individuati in fase di esecuzione associando il modello di identificazione nel Registro di sistema con il modello incorporato nel file di immagine.

Creazione di un lettore di metadati

L'accesso principale ai blocchi di metadati all'interno di un codec è tramite l'interfaccia IWICMetadataBlockReader implementata da ogni codec WIC. Questa interfaccia enumera ogni blocco di metadati incorporato in un formato immagine in modo che il gestore di metadati appropriato possa essere individuato e creato un'istanza per ogni blocco. I blocchi di metadati non riconosciuti da WIC sono considerati sconosciuti e sono definiti come GUID CLSID_WICUnknownMetadataReader. Per avere il formato dei metadati riconosciuto da WIC, è necessario creare una classe che implementa tre interfacce: IWICMetadataReader, IWICPersistStream e IWICStreamProvider.

Nota

Se il formato dei metadati presenta restrizioni che eseguono il rendering inappropriato di alcuni metodi delle interfacce necessarie, tali metodi devono restituire WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Interfaccia IWICMetadataReader

L'interfaccia IWICMetadataReader deve essere implementata durante la creazione di un lettore di metadati. Questa interfaccia consente di accedere agli elementi di metadati sottostanti all'interno del flusso di dati di un formato di metadati.

Il codice seguente mostra la definizione dell'interfaccia del lettore di metadati come definito nel file 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
        );
};

Il metodo GetMetadataFormat restituisce il GUID del formato dei metadati.

Il metodo GetMetadataHandlerInfo restituisce un'interfaccia IWICMetadataHandlerInfo che fornisce informazioni sul gestore dei metadati. Sono incluse informazioni quali i formati di immagine che supportano il formato dei metadati e se il lettore di metadati richiede l'accesso al flusso di metadati completo.

Il metodo GetCount restituisce il numero di singoli elementi di metadati (inclusi i blocchi di metadati incorporati) trovati all'interno del flusso di metadati.

Il metodo GetValueByIndex restituisce un elemento di metadati in base a un valore di indice. Questo metodo consente alle applicazioni di scorrere ogni elemento di metadati in un blocco di metadati. Il codice seguente illustra come un'applicazione può usare questo metodo per recuperare ogni elemento di metadati in un blocco di metadati.

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);
    }               
}

Il metodo GetValue recupera un elemento di metadati specifico per schema e/o ID. Questo metodo è simile al metodo GetValueByIndex , ad eccezione del fatto che recupera un elemento di metadati con uno schema o un ID specifico.

Il metodo GetEnumerator restituisce un enumeratore di ogni elemento di metadati nel blocco di metadati. Ciò consente alle applicazioni di usare un enumeratore per spostarsi nel formato dei metadati.

Se il formato dei metadati non ha una nozione di schemi per gli elementi di metadati, getValue... i metodi devono ignorare questa proprietà. Se, tuttavia, il formato supporta la denominazione dello schema, è consigliabile prevedere un valore NULL .

Se un elemento di metadati è un blocco di metadati incorporato, creare un gestore di metadati dal sottostream del contenuto incorporato e restituire il nuovo gestore di metadati. Se non è disponibile alcun lettore di metadati per il blocco annidato, creare un'istanza e restituire un lettore di metadati sconosciuto. Per creare un nuovo lettore di metadati per il blocco incorporato, chiamare i metodi CreateMetadataReaderFromContainer o CreateMetadataReader della factory del componente oppure chiamare la funzione WICMatchMetadataContent .

Se il flusso di metadati contiene contenuto big-endian, il lettore di metadati è responsabile dello scambio dei valori di dati elaborati. È anche responsabile dell'informare i lettori di metadati annidati che stanno lavorando con il flusso di dati big-endian. Tuttavia, tutti i valori devono essere restituiti in formato little-endian.

Implementare il supporto per lo spostamento dello spazio dei nomi supportando le query in cui l'ID dell'elemento di metadati è un VT_CLSID (GUID) corrispondente a un formato di metadati. Se durante l'analisi viene identificato un lettore di metadati annidato per tale formato, deve essere restituito. Ciò consente alle applicazioni di usare un lettore di query di metadati per eseguire ricerche nel formato dei metadati.

Quando si ottiene un elemento di metadati in base all'ID, è consigliabile usare la funzione PropVariantChangeType per coercire l'ID nel tipo previsto. Ad esempio, il lettore IFD coece un ID per digitare VT_UI2 in modo che coincida con il tipo di dati di un ID tag IFD USHORT. A tale scopo, il tipo di input e il tipo previsto devono essere PROPVARIANT . Questa operazione non è necessaria, ma questa coercizione semplifica il codice che chiama il lettore per eseguire una query per gli elementi di metadati.

Interfaccia IWICPersistStream

L'interfaccia IWICPersistStream eredita da IPersistStream e fornisce metodi aggiuntivi per salvare e caricare oggetti usando l'enumerazione WICPersistOptions .

Il codice seguente mostra la definizione dell'interfaccia IWICPersistStream come definito nel file 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
        );
};

Il metodo LoadEx fornisce al lettore di metadati un flusso di dati contenente il blocco di metadati. Il lettore analizza questo flusso per accedere agli elementi di metadati sottostanti. Il lettore di metadati viene inizializzato con un sottostream posizionato all'inizio del contenuto dei metadati non elaborati. Se il lettore non richiede il flusso completo, il sottostream è limitato solo al contenuto del blocco di metadati; in caso contrario, il flusso di metadati completo viene fornito con la posizione impostata all'inizio del blocco di metadati.

Il metodo SaveEx viene usato dai writer di metadati per serializzare il blocco di metadati. Quando SaveEx viene usato in un lettore di metadati, deve restituire WINCODEC_ERR_UNSUPPORTEDOPERATION.

Interfaccia IWICStreamProvider

L'interfaccia IWICStreamProvider consente al lettore di metadati di fornire riferimenti al flusso di contenuto, fornire informazioni sul flusso e aggiornare le versioni memorizzate nella cache del flusso.

Il codice seguente mostra la definizione dell'interfaccia IWICStreamProvider come definito nel file wincodecsdk.idl.

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

    HRESULT GetPersistOptions(
        [out] DWORD *pdwPersistOptions
        );

    HRESULT GetPreferredVendorGUID(
        [out] GUID *pguidPreferredVendor
        );

    HRESULT RefreshStream(
        );
};

Il metodo GetStream recupera un riferimento al flusso di metadati. Il flusso restituito deve avere il puntatore del flusso reimpostato sulla posizione iniziale. Se il formato dei metadati richiede l'accesso completo al flusso, la posizione iniziale deve essere l'inizio del blocco di metadati.

Il metodo GetPersistOptions restituisce le opzioni correnti del flusso dall'enumerazione WICPersistOptions .

Il metodo GetPreferredVendorGUID restituisce il GUID del fornitore del lettore di metadati.

Il metodo RefreshStream aggiorna il flusso di metadati. Questo metodo deve chiamare LoadEx con un flusso NULL per tutti i blocchi di metadati annidati. Ciò è necessario perché i blocchi di metadati annidati e i relativi elementi potrebbero non esistere più, a causa della modifica sul posto.

Creazione di un writer di metadati

Un writer di metadati è un tipo di gestore di metadati che consente di serializzare un blocco di metadati in un frame di immagine o all'esterno di un singolo frame, se il formato dell'immagine lo supporta. L'accesso principale ai writer di metadati all'interno di un codec consiste nell'interfaccia IWICMetadataBlockWriter implementata da ogni codificatore WIC. Questa interfaccia consente alle applicazioni di enumerare ogni blocco di metadati incorporato in un'immagine in modo che il writer di metadati appropriato possa essere individuato e creato un'istanza per ogni blocco di metadati. I blocchi di metadati che non hanno un writer di metadati corrispondente sono considerati sconosciuti e sono definiti come GUID CLSID_WICUnknownMetadataReader. Per consentire alle applicazioni abilitate per WIC di serializzare e scrivere il formato dei metadati, è necessario creare una classe che implementi le interfacce seguenti: IWICMetadataWriter, IWICMetadataReader, IWICPersistStream e IWICStreamProvider.

Nota

Se il formato dei metadati presenta restrizioni che eseguono il rendering inappropriato di alcuni metodi delle interfacce necessarie, tali metodi devono restituire WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Interfaccia IWICMetadataWriter

L'interfaccia IWICMetadataWriter deve essere implementata dal writer di metadati. Inoltre, poiché IWICMetadataWriter eredita da IWICMetadataReader, è necessario implementare anche tutti i metodi di IWICMetadataReader. Poiché entrambi i tipi di gestore richiedono la stessa ereditarietà dell'interfaccia, è possibile creare una singola classe che fornisca funzionalità di lettura e scrittura.

Il codice seguente mostra la definizione dell'interfaccia del writer di metadati come definito nel file 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
        );
};

Il metodo SetValue scrive l'elemento di metadati specificato nel flusso di metadati.

Il metodo SetValueByIndex scrive l'elemento di metadati specificato nell'indice specificato nel flusso di metadati. L'indice non fa riferimento all'ID ma alla posizione dell'elemento all'interno del blocco di metadati.

Il metodo RemoveValue rimuove l'elemento di metadati specificato dal flusso di metadati.

Il metodo RemoveValueByIndex rimuove l'elemento di metadati in corrispondenza dell'indice specificato dal flusso di metadati. Dopo aver rimosso un elemento, è previsto che gli elementi di metadati rimanenti occupino l'indice liberato se l'indice non è l'ultimo indice. È anche previsto che il conteggio cambierà dopo la rimozione dell'elemento.

È responsabilità del writer di metadati convertire gli elementi PROPVARIANT nella struttura sottostante richiesta dal formato. Tuttavia, a differenza del lettore di metadati, i tipi VARIANT in genere non devono essere costretti a tipi diversi perché il chiamante indica in modo specifico il tipo di dati da usare.

Il writer di metadati deve eseguire il commit di tutti gli elementi di metadati nel flusso di immagini, inclusi i valori nascosti o non riconosciuti. Sono inclusi blocchi di metadati annidati sconosciuti. Tuttavia, è responsabilità del codificatore impostare eventuali elementi di metadati critici prima di avviare l'operazione di salvataggio.

Se il flusso di metadati contiene contenuto big-endian, il writer di metadati è responsabile dello scambio di eventuali valori di dati elaborati. È anche responsabile dell'informare tutti i writer di metadati annidati di lavorare con un flusso di dati big-endian quando vengono salvati.

Implementare il supporto per la creazione e la rimozione dello spazio dei nomi supportando le operazioni set e remove sugli elementi di metadati con un tipo di (GUID) corrispondente a un formato di VT_CLSID metadati. Il writer di metadati chiama la funzione WICSerializeMetadataContent per incorporare correttamente il contenuto del writer di metadati annidato nel writer di metadati padre.

Se il formato dei metadati supporta la codifica sul posto, si è responsabili della gestione della spaziatura interna necessaria. Per altre informazioni sulla codifica sul posto, vedere Panoramica dei metadati WIC e Panoramica della lettura e scrittura dei metadati delle immagini.

Interfaccia IWICPersistStream

L'interfaccia IWICPersistStream eredita da IPersistStream e fornisce metodi aggiuntivi per salvare e caricare oggetti usando l'enumerazione WICPersistOptions .

Il codice seguente mostra la definizione dell'interfaccia IWICPersistStream come definito nel file 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
        );
};

Il metodo LoadEx fornisce al gestore dei metadati un flusso di dati contenente il blocco di metadati.

Il metodo SaveEx serializza i metadati in un flusso. Se il flusso fornito è lo stesso del flusso di inizializzazione, è necessario eseguire la codifica sul posto. Se la codifica sul posto è supportata, questo metodo deve restituire WINCODEC_ERR_TOOMUCHMETADATA quando la spaziatura interna non è sufficiente per eseguire la codifica sul posto. Se la codifica sul posto non è supportata, questo metodo deve restituire WINCODEC_ERR_UNSUPPORTEDOPERATION.

Il metodo IPersistStream::GetSizeMax deve essere implementato e deve restituire la dimensione esatta del contenuto dei metadati che verrebbe scritto nel salvataggio successivo.

Il metodo IPersistStream::IsDirty deve essere implementato se il writer di metadati viene inizializzato tramite un flusso, in modo che un'immagine possa determinare in modo affidabile se il relativo contenuto è stato modificato.

Se il formato dei metadati supporta i blocchi di metadati annidati, il writer di metadati deve delegare ai writer di metadati annidati la serializzazione del contenuto durante il salvataggio in un flusso.

Interfaccia IWICStreamProvider

L'implementazione dell'interfaccia IWICStreamProvider per un writer di metadati è uguale a quella di un lettore di metadati. Per altre informazioni, vedere La sezione Creazione di un lettore di metadati in questo documento.

Installazione e registrazione di un gestore di metadati

Per installare un gestore di metadati, è necessario specificare l'assembly del gestore e registrarlo nel Registro di sistema. È possibile decidere come e quando vengono popolate le chiavi del Registro di sistema.

Nota

Per la leggibilità, i GUID esadecimali effettivi non vengono visualizzati nelle chiavi del Registro di sistema illustrate nelle sezioni seguenti di questo documento. Per trovare il valore esadecimale per un nome descrittivo specificato, vedere i file wincodec.idl e wincodecsdk.idl.

 

Chiavi del Registro di sistema del gestore dei metadati

Ogni gestore di metadati viene identificato da un CLSID univoco e ogni gestore è necessario per registrare il relativo CLSID nel GUID di categoria del gestore dei metadati. Ogni ID categoria del tipo di gestore è definito nel file wincodec.idl; il nome ID categoria per i lettori è CATID_WICMetadataReader e il nome ID categoria per i writer è CATID_WICMetadataWriter.

Ogni gestore di metadati viene identificato da un CLSID univoco e ogni gestore è necessario per registrare il relativo CLSID nel GUID di categoria del gestore dei metadati. Ogni ID categoria del tipo di gestore è definito nel file wincodec.idl; il nome ID categoria per i lettori è CATID_WICMetadataReader e il nome ID categoria per i writer è CATID_WICMetadataWriter.

Nota

Negli elenchi di chiavi del Registro di sistema seguenti {Reader CLSID} fa riferimento al CLSID univoco fornito per il lettore di metadati. {Writer CLSID} fa riferimento al CLSID univoco fornito per il writer di metadati. {Handler CLSID} fa riferimento al CLSID del lettore, al CLSID del writer o a entrambi, a seconda dei gestori forniti. {GUID contenitore} fa riferimento all'oggetto contenitore (formato immagine o formato di metadati) che può contenere il blocco di metadati.

 

Le chiavi del Registro di sistema seguenti registrano il gestore dei metadati con gli altri gestori di metadati disponibili:

[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"

Oltre a registrare i gestori nelle rispettive categorie, è necessario registrare anche chiavi aggiuntive che forniscono informazioni specifiche per il gestore. I lettori e i writer condividono requisiti di chiave del Registro di sistema simili. La sintassi seguente illustra come registrare un gestore. Sia il gestore del lettore che il gestore del writer devono essere registrati in questo modo, usando i rispettivi 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"

Lettori di metadati

La registrazione del lettore di metadati include anche chiavi che descrivono come il lettore può essere incorporato in un formato contenitore. Un formato contenitore può essere un formato di immagine, ad esempio TIFF o JPEG; può anche essere un altro formato di metadati, ad esempio un blocco di metadati IFD. I formati dei contenitori di immagini supportati in modo nativo sono elencati in wincodec.idl; ogni formato contenitore di immagini è definito come GUID con un nome che inizia con GUID_ContainerFormat. I formati dei contenitori di metadati supportati in modo nativo sono elencati in wincodecsdk.idl; ogni formato del contenitore di metadati viene definito come GUID con un nome che inizia con GUID_MetadataFormat.

Le chiavi seguenti registrano un contenitore supportato dal lettore di metadati e i dati necessari per la lettura da tale contenitore. Ogni contenitore supportato dal lettore deve essere registrato in questo modo.

[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 chiave Pattern descrive il modello binario usato per trovare la corrispondenza tra il blocco di metadati e il lettore. Quando si definisce un modello per il lettore di metadati, deve essere abbastanza affidabile che una corrispondenza positiva indica che il lettore di metadati può comprendere i metadati nel blocco di metadati in fase di elaborazione.

La chiave DataOffset descrive l'offset fisso dei metadati dall'intestazione del blocco. Questa chiave è facoltativa e, se non specificata, significa che i metadati effettivi non possono trovarsi usando un offset fisso dall'intestazione del blocco.

Writer di metadati

La registrazione del writer di metadati include anche chiavi che descrivono come scrivere l'intestazione che precede il contenuto dei metadati incorporato in un formato contenitore. Come per il lettore, un formato contenitore può essere un formato di immagine o un altro blocco di metadati.

Le chiavi seguenti registrano un contenitore supportato dal writer di metadati e i dati necessari per scrivere l'intestazione e i metadati. Ogni contenitore supportato dal writer deve essere registrato in questo modo.

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

La chiave WriteHeader descrive il modello binario dell'intestazione del blocco di metadati da scrivere. Questo modello binario coincide con la chiave pattern del formato di metadati.

La chiave WriteOffset descrive l'offset fisso dall'intestazione del blocco in corrispondenza della quale devono essere scritti i metadati. Questa chiave è facoltativa e, se non specificata, significa che i metadati effettivi non devono essere scritti con l'intestazione.

Firma di un gestore di metadati

Tutti i gestori di metadati devono essere firmati digitalmente per partecipare al processo di individuazione WIC. WiC non caricherà alcun gestore non firmato da un'autorità di certificazione attendibile. Per altre informazioni sulla firma digitale, vedere Introduzione alla firma del codice.

Considerazioni speciali

Le sezioni seguenti includono informazioni aggiuntive da considerare quando si creano gestori di metadati personalizzati.

PROPVARIANTS

WIC usa un PROPVARIANT per rappresentare un elemento di metadati sia per la lettura che per la scrittura. UN PROPVARIANT fornisce un tipo di dati e un valore di dati per un elemento di metadati usato all'interno di un formato di metadati. Il writer di un gestore di metadati ha una notevole flessibilità sulla modalità di archiviazione dei dati nel formato dei metadati e sul modo in cui i dati vengono rappresentati all'interno di un blocco di metadati. La tabella seguente fornisce linee guida che consentono di decidere il tipo PROPVARIANT appropriato da usare in situazioni diverse.

Il tipo di metadati è... Usare il tipo PROPVARIANT PROPVARIANT, proprietà
Vuoto o inesistente. VT_EMPTY Non applicabile.
Non definito. VT_BLOB Utilizzare la proprietà BLOB per impostare le dimensioni e il puntatore all'oggetto BLOB allocato usando CoTaskMemAlloc.
Blocco di metadati. VT_UNKNOWN Questo tipo usa la proprietà punkVal.
Matrice di tipi. VT_VECTOR | VT_{type} Utilizzare la proprietà ca{type} per impostare il conteggio e il puntatore sulla matrice allocata usando CoTaskMemAlloc.
Matrice di blocchi di metadati. VT_VECTOR | VT_VARIANT Utilizzare la proprietà capropvar per impostare la matrice di varianti.
Valore razionale firmato. VT_I8 Utilizzare la proprietà hVal per impostare il valore. Impostare la parola alta sul denominatore e sulla parola bassa sul numeratore.
Valore razionale. VT_UI8 Utilizzare la proprietà uhVal per impostare il valore. Impostare HighPart sul denominatore e su LowPart sul numeratore. Si noti che LowPart è un int senza segno. Il numeratore deve essere convertito da un int senza segno a un int per assicurarsi che il bit di segno venga mantenuto se presente.

 

Per evitare la ridondanza nella rappresentazione degli elementi della matrice, non usare matrici sicure; usa solo matrici semplici. Ciò riduce il lavoro che un'applicazione deve eseguire durante l'interpretazione dei tipi PROPVARIANT .

Evitare di usare VT_BYREF e archiviare valori inline ogni volta che è possibile. VT_BYREF è inefficiente per piccoli tipi (comuni per gli elementi di metadati) e non fornisce informazioni sulle dimensioni.

Prima di usare un PROPVARIANT, chiamare sempre PropVariantInit per inizializzare il valore. Al termine dell'operazione PROPVARIANT, chiamare sempre PropVariantClear per rilasciare qualsiasi memoria allocata per la variabile.

Gestori 8BIM

Quando si scrive un gestore di metadati per un blocco di metadati 8BIM, è necessario usare una firma che incapsula sia la firma 8BIM che l'ID. Ad esempio, il lettore di metadati 8BIMIPTC nativo fornisce le informazioni del Registro di sistema seguenti per l'individuazione dei lettori:

[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

Il lettore 8BIMIPTC ha un modello registrato di 0x38, 0x42, 0x49, 0x4D, 0x04, 0x04. I primi quattro byte (0x38, 0x42, 0x49, 0x4D) sono la firma 8BIM e gli ultimi due byte (0x04, 0x04) sono l'ID per il record IPTC.

Quindi, per scrivere un lettore di metadati 8BIM per le informazioni sulla risoluzione, è necessario un modello registrato di 0x38, 0x42, 0x49, 0x4D, 0x03, 0xED. Di nuovo, i primi quattro byte (0x38, 0x42, 0x49, 0x4D) sono la firma 8BIM. Gli ultimi due byte (0x03, 0xED), tuttavia, sono l'ID delle informazioni di risoluzione come definito dal formato PSD.

Informazioni concettuali

Panoramica del componente Di creazione immagini di Windows

Panoramica dei metadati WIC

Panoramica del linguaggio di query dei metadati

Panoramica della lettura e della scrittura dei metadati dell'immagine

Procedura: Codificare nuovamente un'immagine JPEG con metadati

Altre risorse

Come scrivere un codec WIC-Enabled