Panoramica dei metadati WIC

In questo argomento viene presentato il supporto dei metadati per la creazione di immagini fornito dal componente Windows Imaging (WIC). Fornisce un'introduzione alla lettura e alla scrittura di metadati dei metadati, al linguaggio di query dei metadati e all'estendibilità del gestore dei metadati.

I metadati dell'immagine sono dati incorporati all'interno di un file di immagine che fornisce informazioni aggiuntive sull'immagine, ad esempio il dispositivo usato per acquisire l'immagine o le dimensioni dell'immagine. Anche se è contenuto all'interno del file di immagine stesso, questi metadati non fanno parte dei dati di rendering. WIC fornisce interfacce che consentono di leggere e scrivere questi metadati per diversi formati di metadati comuni, tra cui Extensible Metadata Platform (XMP), File di immagini scambiabili (EXIF) e Dati testo png (tEXt).

In questo argomento sono contenute le sezioni seguenti.

Prerequisiti

Per comprendere questo argomento, è necessario avere familiarità con le interfacce del codificatore e del decodificatore WIC e i relativi componenti COM (Component Object Model), come descritto in Cenni preliminari sul componente Windows Imaging. Consente inoltre di acquisire familiarità generale con alcuni dei formati di metadati di creazione dell'immagine attualmente in uso.

Introduzione

I metadati forniscono informazioni estese su un'immagine. Queste informazioni possono essere usate in diversi modi. Un'immagine può contenere metadati, ad esempio una descrizione, una classificazione, tag di categoria e informazioni sul copyright. L'accesso ai metadati semplifica l'esecuzione di attività come la gestione degli asset, il percorso dei file o la determinazione delle informazioni sul copyright. Ad esempio, Raccolta foto di Windows in Windows Vista consente di aggiungere descrizioni e tag di categoria alle immagini. Ciò consente una migliore individuabilità delle immagini e un modo pratico per classificare le immagini. Usando le API WIC e i formati di metadati comuni, le applicazioni possono scrivere o leggere facilmente questo tipo di metadati da o verso immagini.

Il diagramma seguente illustra il contenuto di un file JPEG che include blocchi di metadati incorporati e elementi di metadati.

immagine jpeg con metadati di classificazione

In questa immagine di esempio i metadati vengono incorporati nel file di immagine all'interno di un frame di immagine. Il formato JPEG non supporta più fotogrammi di immagine, quindi i metadati sono concettualmente collegati a questo singolo fotogramma. I formati che supportano più fotogrammi, ad esempio TIFF, possono avere metadati collegati a ogni fotogramma immagine, come illustrato in questo diagramma. Anche se attualmente non è comune e non è supportato dai codec immagine nativi, alcuni formati di immagine possono supportare anche i metadati all'esterno di un frame di immagine. WiC è abbastanza flessibile per gestire sia i metadati a livello di fotogramma che i metadati all'esterno del singolo frame di un'immagine.

Lettura dei metadati dell'immagine

Le API WIC forniscono componenti COM che semplificano la lettura e la scrittura dei metadati delle immagini da parte delle applicazioni.

Il modo principale per leggere i metadati consiste nell'usare un lettore di query dei metadati (IWICMetadataQueryReader) per accedere a elementi di metadati specifici. Il componente lettore di query dei metadati viene implementato dal codec e può essere accessibile a livello di decodificatore o tramite singoli fotogrammi di immagine, che è il metodo più comune. Il codice seguente illustra come accedere a un lettore di query per un singolo frame usando il metodo GetMetadataQueryReader del lettore di query.

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

Un lettore di query fornisce metodi per ottenere informazioni su metadati specifici e un mezzo per specificare un elemento di metadati da recuperare. Il codice seguente usa un'espressione di query per richiedere un elemento di metadati specifico all'interno del blocco IFD (Nested Image File Directory) di App1. Questa operazione viene eseguita usando il metodo GetMetadataByName del lettore di query. Il codice seguente illustra l'uso del lettore di query per ottenere il valore di classificazione MicrosoftPhoto.

PROPVARIANT value;
PropVariantInit(&value);

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

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

La variabile pwzRatingQuery nell'esempio precedente è la stringa di query per accedere alla classificazione MicrosoftPhoto dell'elemento di metadati. Questa stringa viene creata usando il linguaggio di query dei metadati. Per creare questa stringa, è necessario conoscere il formato dei metadati e il linguaggio di query dei metadati per recuperare singoli elementi di metadati. Per altre informazioni sul linguaggio di query dei metadati, vedere Panoramica del linguaggio di query sui metadati.

Dietro le quinte, un lettore di query usa un lettore di metadati (IWICMetadataReader) per accedere ai metadati descritti dall'espressione di query. Oltre a usare un lettore di query, è anche possibile accedere a un lettore di metadati direttamente per leggere i metadati. È possibile ottenere un lettore di metadati dal decodificatore o dai singoli fotogrammi eseguendo una query per un'interfaccia IWICMetadataBlockReader (IWICMetadataBlockReader).

Scrittura di metadati immagine

Il processo di scrittura dei metadati è simile al modo in cui viene letto, ad eccezione del fatto che viene usato un writer di query di metadati (IWICMetadataQueryWriter). L'interfaccia del writer di query viene implementata dal codificatore di immagini e, come nel lettore di query, i metadati sono accessibili sia nel codificatore che nei singoli fotogrammi (a seconda del supporto del formato dell'immagine).

Il codice seguente illustra come ottenere un writer di query da un frame del codificatore e rimuovere il valore di classificazione letto in precedenza.

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

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

Un altro modo per scrivere metadati consiste nell'usare aggiornamenti rapidi dei metadati. La codifica rapida dei metadati è un modo per scrivere metadati di immagine senza dover codificare nuovamente un file di immagine. Questa operazione viene eseguita scrivendo nuove informazioni sui metadati in un'area riempita del formato dei metadati. Il codificatore di metadati veloce (IWICFastMetadataEncoder) viene ottenuto dalla factory dei componenti, in base al decodificatore di immagini. Il codificatore di metadati veloce ottiene quindi un writer di query usato per scrivere i metadati. Infine, il codificatore rapido esegue il commit della modifica.

Il codice seguente illustra come ottenere un codificatore di metadati rapido e usarlo per scrivere il valore 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();
    }
}

Non tutti i formati di metadati supportano metadati veloci. Per vedere quali formati supportati in modo nativo supportano la codifica rapida dei metadati, vedere la tabella nella sezione Formati di metadati supportati più avanti in questo documento.

Dietro le quinte, un writer di query usa un writer di metadati (IWICMetadataWriter) per scrivere i metadati descritti dall'espressione di query. Oltre a usare un lettore di query, è anche possibile accedere a un writer di metadati direttamente per scrivere metadati. È possibile ottenere un writer di metadati dal decodificatore o dai singoli fotogrammi usando l'esecuzione di query per un'interfaccia IWICMetadataBlockWriter (IWICMetadataBlockWriter).

Estensibilità dei metadati

Come accennato in precedenza, WIC fornisce diversi gestori di metadati per leggere e scrivere metadati per i formati di metadati comuni. Esistono tuttavia alcuni formati di metadati non supportati in modo nativo. Windows Information Protection fornisce quindi API per la creazione di gestori di metadati aggiuntivi in grado di estendere il supporto dei metadati ad altri formati.

Per supportare completamente altri formati di metadati, è necessario sviluppare due tipi di gestori, ovvero un lettore di metadati per leggere i metadati e un writer di metadati per scrivere metadati. Anche se questi due gestori vengono in genere implementati in coppie per un formato specifico, questo non è un requisito. Potrebbero verificarsi alcuni casi in cui è necessaria solo la capacità di lettura o solo la capacità di scrittura.

Per altre informazioni sull'estendibilità dei metadati tramite le API WIC, vedere Panoramica dell'estendibilità dei metadati.

Formati di metadati supportati

WiC offre supporto per diversi formati di metadati comuni. Nella tabella seguente sono elencati i formati di metadati supportati, le relative versioni, i formati di immagine che supportano il formato dei metadati e se il formato dei metadati supporta la codifica rapida dei metadati. Per altre informazioni sulla codifica rapida dei metadati, vedere la sezione Scrittura di metadati immagine più indietro in questo documento.

Formati di metadati supportati Versione della specifica dei metadati Supporto del formato di immagine Supporta la codifica rapida dei metadati
App0 JFIF 1.02 JPEG No
App1 JFIF 1.02 JPEG, TIFF No
App13 Sconosciuto JPEG, TIFF No
IFD TIFF 6.0 JPEG, TIFF
IRB Sconosciuto JPEG, TIFF No
Exif Exif 2.2 JPEG, TIFF
XMP XMP 1.0 (settembre 2005) JPEG, TIFF
GPS Exif 2.2 JPEG, TIFF
IPTC IPTC 4.0 JPEG, TIFF
Testo PNG 1.2 PNG No

 

Nota

IPTC supporta solo FME se i blocchi aumentano di dimensioni, perché IPTC non supporta la spaziatura interna.

 

Riepilogo dei componenti dei metadati

Nella tabella seguente vengono descritte le interfacce WIC che supportano i metadati e i relativi componenti corrispondenti. Questi componenti forniscono l'accesso ai metadati di un'immagine. Per altre informazioni su questi componenti, vedere Panoramica del componente di Creazione immagini di Windows.

Componente Descrizione
Decodificatore bitmap (IWICBitmapDecoder)
  • Legge un flusso di immagini e produce un'origine bitmap utilizzabile. Associato a un formato contenitore, ad esempio Il formato di file immagine contrassegnato (TIFF) o il gruppo di esperti fotografici comuni (JPEG).
  • Implementa un'interfaccia IWICMetadataBlockReader per enumerare tutti i blocchi di metadati nel flusso di dati del decodificatore che non si trovano all'interno di un frame.
  • Espone un lettore di query per leggere i metadati associati all'immagine che non si trova all'interno di un frame.
Decodifica frame bitmap (IWICBitmapFrameDecode)
  • Accede a singoli fotogrammi dal flusso di immagini mantenuto dal decodificatore.
  • Implementa un'interfaccia IWICMetadataBlockReader per enumerare tutti i blocchi di metadati nel flusso di dati del frame.
  • Espone un lettore di query per leggere i metadati associati al frame usando espressioni di query.
Codificatore bitmap (IWICBitmapEncoder)
  • Scrive un'origine bitmap in un flusso di immagini. Associato a un formato contenitore, ad esempio TIFF o JPEG.
  • Implementa un'interfaccia IWICMetadataBlockWriter per compilare un elenco di blocchi di metadati da scrivere nel flusso di dati del codificatore.
  • Espone un writer di query per scrivere i metadati associati all'immagine usando espressioni di query.
Codifica frame bitma (IWICBitmapFrameEncode)
  • Crea un frame che verrà codificato nel flusso mantenuto dal codificatore.
  • Implementa un'interfaccia IWICMetadataBlockWriter per compilare un elenco di blocchi di metadati da scrivere nel flusso di dati del frame.
  • Espone un writer di query per scrivere i metadati associati al frame usando espressioni di query.

 

La tabella seguente descrive i componenti dei metadati WIC. Questi componenti consentono di leggere e scrivere i metadati in un'immagine esposta dai componenti elencati nella tabella precedente.

Componente Descrizione
Lettore di query dei metadati (IWICMetadataQueryReader)
  • Accetta una stringa di query e sposta la gerarchia dei metadati sottostante per ottenere i metadati.
Writer di query dei metadati (IWICMetadataQueryWriter)
  • Accetta una stringa di query e sposta la gerarchia dei metadati sottostante per ottenere, impostare e rimuovere i metadati.
Lettore blocchi di metadati (IWICMetadataBlockReader)
  • Gestisce una raccolta di sola lettura di oggetti IWICMetadataReader nella parte superiore della gerarchia dei metadati e abilita l'enumerazione di tutti i blocchi di metadati.
  • Implementato da un decodificatore bitmap e da un frame bitmap decodificato.
  • Implementato dagli sviluppatori di componenti di terze parti per codec personalizzati.
Writer dei blocchi di metadati (IWICMetadataBlockWriter)
  • Gestisce una raccolta di lettura e scrittura di oggetti IWICMetadataWriter nella parte superiore della gerarchia dei metadati.
  • Implementato da un codificatore bitmap e da una codifica di frame bitmap.
  • Implementato dagli sviluppatori di componenti di terze parti per codec personalizzati.
Lettore metadati (IWICMetadataReader)
  • Analizza un flusso di metadati e gestisce una raccolta di sola lettura degli elementi di metadati. Associato a un formato di metadati, ad esempio EXIF, IFD e XMP.
  • Funge da dizionario, restituendo un valore quando viene specificato un formato e una coppia ID.
  • Implementato dagli sviluppatori di componenti di terze parti per i tipi di metadati personalizzati.
Writer dei metadati (IWICMetadataWriter)
  • Analizza e serializza un flusso di metadati e gestisce una raccolta di metadati di lettura/scrittura.
  • Implementato dagli sviluppatori di componenti di terze parti per i tipi di metadati personalizzati.
Codificatore di metadati veloceIWICFastMetadataEncoder
  • Espone la semantica per la scrittura in una gerarchia di metadati che aggiornerà i metadati sul posto senza codificare nuovamente l'immagine.

 

Informazioni concettuali

Panoramica del componente Di creazione immagini di Windows

Panoramica del linguaggio di query dei metadati

Panoramica della lettura e della scrittura dei metadati dell'immagine

Panoramica dell'estendibilità dei metadati

Procedura: Codificare nuovamente un'immagine JPEG con metadati