Visão geral dos metadados do WIC

Este tópico apresenta o suporte a metadados de imagem fornecido pelo WIC (Componente de Imagem do Windows). Ele fornece uma introdução à leitura e gravação de metadados de imagem, à linguagem de consulta de metadados e à extensibilidade do manipulador de metadados.

Metadados de imagem são dados inseridos dentro de um arquivo de imagem que fornecem informações adicionais sobre a imagem, como o dispositivo usado para capturar a imagem ou as dimensões da imagem. Embora ele esteja contido no próprio arquivo de imagem, esses metadados não fazem parte dos dados de renderização. O WIC fornece interfaces que permitem ler e gravar esses metadados para vários formatos de metadados comuns, incluindo XMP (Extensible Metadata Platform), EXIF (Exchangeable Image File) e Png Textual Data (tEXt).

Este tópico inclui as seções a seguir.

Pré-requisitos

Para entender este tópico, você deve estar familiarizado com as interfaces de codificador e decodificador wic e seus componentes com COM (Component Object Model) relacionados, conforme descrito na Visão geral do componente de imagem do Windows. Ele também ajuda a ter uma familiaridade geral com alguns dos formatos de metadados de imagem em uso hoje.

Introdução

Os metadados fornecem informações estendidas sobre uma imagem. Essas informações podem ser usadas de várias maneiras. Uma imagem pode conter metadados como uma descrição, classificação, marcas de categoria e informações de direitos autorais. Acessar os metadados facilita a execução de tarefas como gerenciamento de ativos, localização de arquivo ou determinação de informações de direitos autorais. Por exemplo, a Galeria de Fotos do Windows no Windows Vista permite adicionar descrições e marcas de categoria a imagens. Isso permite uma melhor descoberta de imagens e uma maneira conveniente de categorizar imagens. Usando as APIs wic e formatos de metadados comuns, os aplicativos podem facilmente gravar ou ler esse tipo de metadados de ou para imagens.

O diagrama a seguir ilustra o conteúdo de um arquivo JPEG que inclui blocos de metadados inseridos e itens de metadados.

imagem jpeg com metadados de classificação

Nesta imagem de exemplo, os metadados são inseridos no arquivo de imagem dentro de um quadro de imagem. O formato JPEG não dá suporte a vários quadros de imagem, portanto, os metadados são anexados conceitualmente a esse único quadro. Formatos que dão suporte a vários quadros, como TIFF, podem ter metadados anexados a cada quadro de imagem, como mostra este diagrama. Embora não seja comum atualmente e não seja compatível com codecs de imagem nativos, alguns formatos de imagem também podem dar suporte a metadados fora de um quadro de imagem. O WIC é flexível o suficiente para lidar com metadados no nível do quadro e metadados fora do quadro individual de uma imagem.

Lendo metadados de imagem

As APIs do WIC fornecem componentes COM que facilitam a leitura e gravação de metadados de imagem pelos aplicativos.

A principal maneira de ler metadados é usar um leitor de consulta de metadados (IWICMetadataQueryReader) para acessar itens de metadados específicos. O componente leitor de consulta de metadados é implementado pelo codec e pode ser acessado no nível do decodificador ou por meio de quadros de imagem individuais, que é o método mais comum. O código a seguir demonstra como acessar um leitor de consulta para um quadro individual usando o método GetMetadataQueryReader do leitor de consulta.

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

Um leitor de consulta fornece métodos para obter informações sobre metadados específicos e um meio de especificar um item de metadados a ser recuperado. O código a seguir usa uma expressão de consulta para solicitar um item de metadados específico dentro do bloco IFD (diretório de arquivo de imagem aninhado) do App1. Isso é feito usando o método GetMetadataByName do leitor de consulta. O código a seguir demonstra como usar o leitor de consulta para obter o valor de classificação do MicrosoftPhoto.

PROPVARIANT value;
PropVariantInit(&value);

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

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

A variável pwzRatingQuery no exemplo anterior é a cadeia de caracteres de consulta para acessar a classificação MicrosoftPhoto do item de metadados. Essa cadeia de caracteres é criada usando a linguagem de consulta de metadados. Para criar essa cadeia de caracteres, é necessário conhecimento do formato de metadados e da linguagem de consulta de metadados para recuperar itens de metadados individuais. Para obter mais informações sobre a linguagem de consulta de metadados, consulte a Visão geral da linguagem de consulta de metadados.

Nos bastidores, um leitor de consulta usa um leitor de metadados (IWICMetadataReader) para acessar os metadados descritos pela expressão de consulta. Além de usar um leitor de consulta, você também pode acessar um leitor de metadados diretamente para ler metadados. Você pode obter um leitor de metadados do decodificador ou quadros individuais consultando uma interface de leitor de bloco (IWICMetadataBlockReader).

Gravando metadados de imagem

O processo de gravação de metadados é semelhante à maneira como são lidos, exceto pelo uso de um gravador de consulta de metadados (IWICMetadataQueryWriter). A interface do gravador de consulta é implementada pelo codificador de imagem e, como no leitor de consulta, os metadados são acessados no codificador e em quadros individuais (dependendo do suporte ao formato de imagem).

O código a seguir demonstra como obter um gravador de consulta de um quadro de codificador e remover o valor de classificação que foi lido 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}");
}

Outra maneira de gravar metadados é por meio de atualizações rápidas de metadados. A codificação rápida de metadados é uma maneira de gravar metadados de imagem sem precisar codificar novamente um arquivo de imagem. Isso é feito escrevendo novas informações de metadados em uma região acolchoada do formato de metadados. O codificador de metadados rápido (IWICFastMetadataEncoder) é obtido da fábrica de componentes, com base no decodificador de imagem. Em seguida, o codificador de metadados rápido obtém um gravador de consulta usado para gravar os metadados. Por fim, o codificador rápido confirma a alteração.

O código a seguir demonstra como obter um codificador de metadados rápido e usá-lo para gravar o 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();
    }
}

Nem todos os formatos de metadados dão suporte a metadados rápidos. Para ver quais formatos com suporte nativo dão suporte à codificação rápida de metadados, consulte a tabela na seção Formatos de metadados com suporte mais adiante neste documento.

Nos bastidores, um gravador de consulta usa um gravador de metadados (IWICMetadataWriter) para gravar os metadados descritos pela expressão de consulta. Além de usar um leitor de consulta, você também pode acessar um gravador de metadados diretamente para gravar metadados. Você pode obter um gravador de metadados do decodificador ou quadros individuais usando a consulta de uma interface de gravador de bloco (IWICMetadataBlockWriter).

Extensibilidade de metadados

Conforme mencionado anteriormente, o WIC fornece vários manipuladores de metadados para ler e gravar metadados para formatos de metadados comuns. No entanto, há alguns formatos de metadados que não têm suporte nativo. Portanto, o WIC fornece APIs para criar manipuladores de metadados adicionais que podem estender o suporte a metadados para outros formatos.

Para dar suporte total a outros formatos de metadados, dois tipos de manipuladores devem ser desenvolvidos : um leitor de metadados para ler metadados e um gravador de metadados para gravar metadados. Embora esses dois manipuladores geralmente sejam implementados em pares para um formato específico, isso não é um requisito. Pode haver alguns casos em que apenas a capacidade de leitura ou apenas a capacidade de gravação é necessária.

Para obter mais informações sobre extensibilidade de metadados usando as APIs wic, consulte a Visão geral da extensibilidade de metadados.

Formatos de metadados com suporte

O WIC dá suporte a vários formatos de metadados comuns. A tabela a seguir lista os formatos de metadados com suporte, suas versões, os formatos de imagem que dão suporte ao formato de metadados e se o formato de metadados dá suporte à codificação rápida de metadados. Para obter mais informações sobre a codificação rápida de metadados, consulte a seção Escrevendo metadados de imagem anteriormente neste documento.

Formatos de metadados com suporte Versão da especificação de metadados Suporte ao formato de imagem Dá suporte à codificação de metadados rápida
App0 JFIF 1.02 JPEG Não
Aplicativo1 JFIF 1.02 JPEG, TIFF Não
App13 Unknown JPEG, TIFF Não
IFD TIFF 6.0 JPEG, TIFF Sim
IRB Unknown JPEG, TIFF Não
Exif Exif 2.2 JPEG, TIFF Sim
XMP XMP 1.0 (setembro de 2005) JPEG, TIFF Sim
GPS Exif 2.2 JPEG, TIFF Sim
IPTC IPTC 4.0 JPEG, TIFF Sim
Texto PNG 1.2 PNG Não

 

Observação

O IPTC só dá suporte ao FME se os blocos aumentarem de tamanho, pois o IPTC não dá suporte ao preenchimento.

 

Resumo do componente de metadados

A tabela a seguir descreve as interfaces WIC que dão suporte a metadados e seus componentes correspondentes. Esses componentes fornecem o acesso aos metadados de uma imagem. Para obter mais informações sobre esses componentes, consulte Visão geral do componente de imagem do Windows.

Componente Descrição
Decodificador de Bitmap (IWICBitmapDecoder)
  • Lê um fluxo de imagem e produz uma fonte de bitmap utilizável. Associado a um formato de contêiner, como TIFF (Formato de Arquivo de Imagem Marcada) ou JPEG (Joint Photographic Experts Group).
  • Implementa uma interface IWICMetadataBlockReader para enumerar todos os blocos de metadados no fluxo de dados do decodificador que não estão dentro de um quadro.
  • Expõe um leitor de consulta para ler os metadados associados à imagem que não está dentro de um quadro.
Decodificação de quadro de bitmap (IWICBitmapFrameDecode)
  • Acessa quadros individuais do fluxo de imagem mantido pelo decodificador.
  • Implementa uma interface IWICMetadataBlockReader para enumerar todos os blocos de metadados no fluxo de dados do quadro.
  • Expõe um leitor de consulta para ler os metadados associados ao quadro, usando expressões de consulta.
Codificador bitmap (IWICBitmapEncoder)
  • Grava uma origem de bitmap em um fluxo de imagem. Associado a um formato de contêiner, como TIFF ou JPEG.
  • Implementa uma interface IWICMetadataBlockWriter para criar uma lista de blocos de metadados a serem gravados no fluxo de dados do codificador.
  • Expõe um gravador de consulta para gravar os metadados associados à imagem, usando expressões de consulta.
Codificação de quadro de bitma (IWICBitmapFrameEncode)
  • Cria um quadro que será codificado no fluxo mantido pelo codificador.
  • Implementa uma interface IWICMetadataBlockWriter para criar uma lista de blocos de metadados a serem gravados no fluxo de dados do quadro.
  • Expõe um gravador de consulta para gravar os metadados associados ao quadro usando expressões de consulta.

 

A tabela a seguir descreve os componentes de metadados do WIC. Esses componentes permitem que você leia e escreva os metadados em uma imagem exposta pelos componentes listados na tabela anterior.

Componente Descrição
Leitor de Consulta de Metadados (IWICMetadataQueryReader)
  • Usa uma cadeia de caracteres de consulta e navega na hierarquia de metadados subjacente para obter metadados.
Gravador de Consulta de Metadados (IWICMetadataQueryWriter)
  • Usa uma cadeia de caracteres de consulta e navega na hierarquia de metadados subjacente para obter, definir e remover metadados.
Leitor de Bloco de Metadados (IWICMetadataBlockReader)
  • Gerencia uma coleção somente leitura de objetos IWICMetadataReader na parte superior da hierarquia de metadados e permite a enumeração de todos os blocos de metadados.
  • Implementado por um decodificador bitmap e um quadro de bitmap decodificado.
  • Implementado por desenvolvedores de componentes de terceiros para codecs personalizados.
Gravador de Bloco de Metadados (IWICMetadataBlockWriter)
  • Gerencia uma coleção de leitura e gravação de objetos IWICMetadataWriter na parte superior da hierarquia de metadados.
  • Implementado por um codificador de bitmap e uma codificação de quadro de bitmap.
  • Implementado por desenvolvedores de componentes de terceiros para codecs personalizados.
Leitor de metadados (IWICMetadataReader)
  • Analisa um fluxo de metadados e gerencia uma coleção somente leitura dos itens de metadados. Associado a um formato de metadados como EXIF, IFD e XMP.
  • Atua como um dicionário, retornando um valor quando dado um formato e um par de IDs.
  • Implementado por desenvolvedores de componentes de terceiros para tipos de metadados personalizados.
Gravador de Metadados (IWICMetadataWriter)
  • Analisa e serializa um fluxo de metadados e gerencia uma coleção de leitura/gravação de itens de metadados.
  • Implementado por desenvolvedores de componentes de terceiros para tipos de metadados personalizados.
Codificador de metadados rápidoIWICFastMetadataEncoder
  • Expõe a semântica para gravação em uma hierarquia de metadados que atualizará os metadados em vigor sem recodificar a imagem.

 

Conceitual

Visão geral do componente de imagem do Windows

Visão geral da linguagem de consulta de metadados

Visão geral dos metadados de imagem de leitura e gravação

Visão geral da extensibilidade de metadados

Instruções: recodificar uma imagem JPEG com metadados