Visão geral da linguagem de consulta de metadados

Este tópico apresenta a linguagem de consulta de metadados para o WIC (Componente de Imagem do Windows). Use a linguagem de consulta de metadados para criar expressões que encontrem dados específicos (itens de metadados) e locais (blocos de metadados) dentro dos metadados de uma imagem.

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

Pré-requisitos

Para entender este tópico, você deve estar familiarizado com o sistema de metadados wic, conforme descrito na Visão geral de metadados do WIC e acessando metadados, conforme descrito na Visão geral da leitura e gravação de metadados de imagem.

Introdução

Você interage com a plataforma de metadados principalmente por meio de dois componentes COM (Component Object Model): um leitor de consulta, representado pela interface IWICMetadataQueryReader e um gravador de consulta, representado pela interface IWICMetadataQueryWriter . Esses componentes permitem que você leia ou escreva metadados usando a linguagem de consulta de metadados. A linguagem de consulta descreve a sintaxe de uma expressão de caminho e os componentes de consulta usam essa expressão de caminho para acessar os metadados desejados. Essa expressão de caminho descreve o local de um bloco ou item de metadados.

Um bloco de metadados é um grupo nomeado de metadados em um formato específico. Um bloco de metadados pode conter itens de metadados individuais, como um autor ou hora de criação e blocos de metadados adicionais. O nome de um bloco de metadados é determinado por seu formato. Por exemplo, um bloco de metadados que contém metadados do App1 seria chamado de "app1". Os formatos de metadados comuns incluem App1, Exif, IFD e XMP.

Um item de metadados é um par nome/valor que descreve características como autor, título e classificação.

Uma expressão de caminho contém um ou mais nomes de bloco de metadados. Ele também pode especificar um item de metadados dentro de um bloco de metadados. A expressão de caminho a seguir representa um bloco App1 que contém um bloco IFD que contém o item de metadados:

  • /app1/ifd/{ushort=18249}

O diagrama a seguir ilustra a composição de uma imagem JPEG de exemplo com quatro blocos de metadados raiz: App0, App1, XMP e um bloco desconhecido. Cada item realçado observa o tipo de metadados (bloco ou item) e a expressão de consulta usada para recuperar os dados.

Imagem jpeg com textos explicativos de metadados

Observação

O conteúdo deste diagrama é referenciado em todo este documento e é usado em muitos dos exemplos.

 

Anatomia de uma expressão de caminho

Para acessar metadados usando as APIs wic, uma expressão de consulta totalmente qualificada deve ser usada na maioria dos casos. Este tópico discute expressões totalmente qualificadas para acessar metadados. Se você precisar de informações sobre os casos em que expressões não totalmente qualificadas são usadas, consulte a seção Expressão de Política de Metadados de Foto mais adiante neste documento.

O que é uma expressão de consulta totalmente qualificada? No WIC, uma expressão totalmente qualificada é uma cadeia de caracteres que começa com a barra de caracteres de caminho (/), seguida por um caminho de navegação para um bloco de metadados ou um item de metadados específico. Cada etapa dentro do caminho de navegação é separada por uma barra, formando uma expressão para acessar um bloco de metadados ou um item de metadados. Por exemplo, veja a seguir uma expressão de consulta totalmente qualificada que acessa o Microsoft Photo Rating em um bloco IFD aninhado em um bloco App1:

  • /app1/ifd/{ushort=18249}

Quando o WIC analisa essa expressão, ele primeiro pesquisa o bloco de metadados app1 dentro dos metadados da imagem. Se o bloco App1 for encontrado, ele continuará sua pesquisa procurando o bloco de metadados IFD aninhado. Se o bloco IFD for encontrado, ele procurará o item de metadados específico, nesse caso, a classificação MicrosoftPhoto na marca 18249, dentro do bloco de metadados IFD. Se a qualquer momento o WIC não encontrar um bloco ou item de metadados, ele anulará a consulta.

Bloquear seleção

A expressão de consulta de metadados WIC mais simples é uma expressão para obter um leitor/gravador de consulta para um bloco de metadados específico. Obter um leitor/gravador de consulta permite direcionar consultas subsequentes diretamente para um bloco de metadados aninhados sem lidar com seu bloco pai. Uma expressão de consulta de seleção de bloco é um caminho de navegação para o bloco de metadados desejado. Por exemplo, na ilustração anterior, há cinco blocos de metadados, dois dos quais estão aninhados em outros blocos de metadados. Veja a seguir as expressões de caminho para cada bloco de metadados no exemplo JPEG:

  • /app0
  • /app1
  • /app1/ifd
  • /app1/ifd/exif
  • /Xmp

Quando você usa um leitor/gravador de consulta para executar uma consulta, ele retorna um novo leitor/gravador de consulta que atende consultas dentro do escopo do bloco de metadados especificado. Por exemplo, se você executar a consulta "/app1", um novo leitor de consulta será obtido e as consultas ao novo leitor serão relativas ao bloco App1. Isso significa que a consulta "/ifd" é válida para o novo leitor porque o bloco App1 contém um bloco IFD. No entanto, "/xmp" não funcionaria porque esse bloco App1 não contém um bloco de metadados XMP.

A linguagem de consulta também dá suporte a uma notação de índice. A notação de índice fornece acesso a um bloco de metadados específico quando existem vários blocos do mesmo tipo. Para o exemplo JPEG, a seguinte expressão de caminho indexado pode ser usada:

  • /[0]app1/[0]ifd

Na linguagem de consulta, todos os índices começam em zero. Na expressão anterior, as primeiras consultas zero para o primeiro bloco App1 e o segundo zero consultam o primeiro bloco IFD aninhado. A notação de índice ainda pode ser usada mesmo quando vários blocos do mesmo tipo não existem. Se o exemplo JPEG incluísse um segundo bloco App1 com um bloco IFD inserido, a expressão "/[1]app1/ifd" seria usada para acessar o segundo bloco app1.

A notação de índice torna-se mais comum ao lidar com partes png tEXt porque é provável que a imagem PNG tenha mais de uma parte tEXt.

Observação

Não há suporte para índices de matriz multidimensional.

 

Seleção de Item

Você pode acessar os itens de metadados em um bloco de metadados criando as expressões de seleção de bloco. Considere as propriedades de classificação XMP e Microsoft Photo no exemplo JPEG. Esses metadados existem em dois blocos de metadados: os blocos App1/IFD e XMP. Portanto, mais de uma expressão pode ser usada para acessar os mesmos dados. A expressão a seguir acessa a classificação MicrosoftPhoto no bloco XMP:

  • /xmp/xmp:Rating

A parte "xmp:" da expressão é um identificador amigável ao esquema. O XMP é um padrão extensível e permite que entidades de terceiros publiquem seus próprios esquemas que definem como armazenar determinados itens de metadados. Um esquema XMP é totalmente identificado por uma URL, mas o WIC fornece um conjunto de identificadores amigáveis para esquemas conhecidos. Para obter mais informações, consulte o tópico Consultas de metadados de formato de imagem nativa .

Para imagens JPEG, as informações de classificação também podem ser armazenadas no bloco IFD aninhado do App1. No entanto, ao contrário do exemplo de classificação XMP, o bloco IFD não usa um nome de esquema para acessar as informações de classificação. Em vez disso, você usa uma expressão de dados. A expressão a seguir é usada para acessar a classificação MicrosoftPhoto no bloco IFD aninhado do App1:

  • /app1/ifd/{ushort=18249}

Nessa expressão, a parte "/app1/ifd" da expressão é o caminho de navegação para o bloco IFD (conforme discutido anteriormente na seção Seleção de Bloco). A segunda parte da expressão "/{ushort=18249}" acessa os dados. Essa parte da expressão instrui o analisador de consulta a localizar os dados inseridos na marca curta sem sinal que tem o identificador de marca 18249.

Observação

Para obter uma lista de formatos de metadados comuns compatíveis com cada formato de imagem em, consulte o tópico Consultas de metadados de formato de imagem nativa .

 

O {ushort=18249} é uma expressão de dados e pode assumir várias formas. Uma expressão de dados é uma expressão de duas partes que contém a marca ou chave de metadados solicitada, nesse caso "18249", e o tipo de dados da chave, nesse caso , "ushort". As duas partes são separadas por um sinal de igual (=). WICsupporta a maioria dos tipos de dados C/C++ comuns. Os seguintes tipos de dados são aceitos pela linguagem de consulta:

  • char
  • uchar
  • short
  • ushort
  • long
  • ulong
  • INT
  • uint
  • Longlong
  • FLOAT
  • double
  • str
  • wstr
  • guid
  • bool

Observação

Essa lista especifica apenas os tipos de dados compatíveis com a linguagem de consulta de metadados. Use esses tipos de dados ao criar uma expressão de dados de consulta de metadados, como {ushort=18249}. O WIC retorna o valor do item de metadados na forma de PROPVARIANT, que define seu próprio sistema de tipos.

 

O "18249" no exemplo é a marca de dados. Esse número específico é definido pela Microsoft para conter a classificação MicrosoftPhoto. A marca de dados pode ser qualquer número, cadeia de caracteres ou GUID, dependendo do item de dados que você está procurando

Ao contrário do exemplo de Classificação XMP, não há nenhuma colisão de nome para o valor de classificação no bloco App1/IFD. Isso ocorre porque o valor de classificação XMP é, na verdade, armazenado em uma marca ushort diferente, 18246. Portanto, a expressão para acessar a classificação XMP no bloco App1/IFD é:

  • /app1/ifd/{ushort=18246}

Observação

Para obter uma descrição formal da linguagem de consulta de metadados, consulte a seção Resumo da linguagem de consulta de metadados mais adiante neste documento.

 

Caractere de escape

A linguagem de consulta não diferencia maiúsculas de minúsculas e trata todos os caracteres como minúsculos. No entanto, alguns formatos de metadados (como XMP) diferenciam maiúsculas de minúsculas. Ao trabalhar com um formato de metadados que diferencia maiúsculas de minúsculas, use o caractere de barra invertida (\) quando quiser especificar um caractere maiúsculo.

O caractere de escape é consumido pelo analisador de linguagem e o caractere a seguir é interpretado diretamente. Por exemplo, a expressão {char=\\} é resolvida como '\'e {char=\C} é resolvida como um C maiúsculo. Sem o caractere de escape, {char=\} seria uma expressão inválida e {char=C} seria interpretado como um c minúsculo. Use o caractere de escape de barra invertida antes de todas as letras maiúsculas em formatos de metadados que diferenciam maiúsculas de minúsculas.

Exemplos de expressões

A tabela a seguir fornece algumas expressões de exemplo e descrições de suas interpretações pelo analisador de linguagem de consulta.

Expression Descrição
ifd/xmp/exif:Author Corresponde ao seguinte caminho de navegação: bloco IFD -> bloco XMP -> propriedade "Author" no esquema "Exif".
/[1]ifd/[0]xmp/exif:Author O mesmo que o primeiro item nesta tabela, exceto que o prefixo [#] descreve qual item navegar em caso de colisão de nome.
/ifd/{ushort=700}/Author O mesmo que o primeiro item nesta tabela, exceto pelo fato de que ele usa uma expressão de dados para referenciar o bloco XMP em vez do nome do bloco "xmp" (o bloco XMP é inserido sob o identificador de marca curta sem sinal 700). Além disso, a propriedade "Author" não especifica um esquema. O analisador de consulta tentará corresponder à propriedade em todos os esquemas e retornará a primeira correspondência.
/ifd/xmp Fornece um caminho de navegação para um bloco de metadados. Se o bloco for encontrado, um novo leitor/gravador de metadados será retornado.
/[*]tEXt/Keyword Obtém ou define a propriedade Keyword para uma parte PNG. Como a especificação de metadados PNG permite várias partes de um tipo específico, a notação [*] obtém/define a parte PNG de dados com a propriedade apropriada. De acordo com a especificação PNG, nenhuma parte pode ter as mesmas propriedades.

 

Cada bloco de metadados também é identificado exclusivamente pelo GUID de metadados que pode ser usado no lugar do nome do bloco amigável. A sintaxe a seguir pode ser usada no lugar do fornecimento de nomes de bloco: "/{guid=GUID}/[n]{guid=GUID}/schema:tagidentifier"

A tabela a seguir fornece alguns exemplos inválidos e os motivos pelos quais eles seriam rejeitados.

Expressão inválida Descrição da rejeição
/ifd/[0][2]exif/ Rejeitado porque não há suporte para índices de matriz multidimensional.
/ifd/{ushort=1}/{ushort=2} Rejeitado, a menos que o IFD tenha um tagID=1, que é um manipulador de metadados que contém um item de metadados com um tagID=2.
/{ushort=1} Rejeitado se o processamento de consulta for relativo a um nível superior da hierarquia de metadados. Isso ocorre porque o nível superior contém apenas blocos de metadados e não itens de dados.

 

Expressões de política de metadados de foto

Conforme observado anteriormente, uma expressão de consulta totalmente qualificada começa com uma barra (/). Expressões que não começam com a barra são avaliadas como expressões de política. Uma expressão de política permite consultar os metadados de foto para propriedades do Windows Shell relacionadas à imagem. Na seção Seleção de Dados anteriormente neste documento, a expressão "/xmp/xmp:Rating" foi usada para acessar a propriedade de classificação XMP. Essa propriedade também pode ser consultada usando a seguinte expressão de política:

  • System.SimpleRating

Para acessar a propriedade rating do esquema MicrosoftPhoto, a seguinte expressão de consulta pode ser usada:

  • System.Rating

As expressões de política de metadados de foto se comportam de forma diferente das consultas de metadados totalmente qualificadas de algumas maneiras notáveis.

Primeiro, ao acessar metadados usando uma expressão de política, o WIC executa arbitragem e resolução de conflitos caso a mesma propriedade esteja disponível em vários blocos de metadados. Por exemplo, os valores de classificação MicrosoftPhoto e XMP são armazenados no bloco App1/IFD e no bloco XMP. A política de metadados de foto determina a precedência para qual valor de bloco é retornado ao ler metadados. Quando você está escrevendo metadados, a política de metadados de foto garante que as mesmas propriedades em blocos diferentes sejam consistentes. Se você usar uma consulta de metadados como "/xmp/xmp:Rating", será responsável por arbitrar entre os vários locais de metadados.

Observação

Para obter uma lista das expressões de política com suporte e suas políticas de mapeamento, consulte o tópico Políticas de metadados de foto.

 

Em segundo lugar, as expressões de política de metadados de foto são independentes do formato de imagem, enquanto as consultas de metadados totalmente qualificadas não são. Por exemplo, a consulta "/xmp/xmp:Rating" é específica para o formato JPEG. As imagens TIFF também dão suporte a metadados XMP, mas são armazenadas de forma diferente em comparação com JPEG, portanto, a consulta TIFF seria "/ifd/xmp/xmp:Rating". No entanto, em ambos os casos, a expressão de política seria "System.SimpleRating".

As expressões de política de metadados de foto fornecem um nível mais alto de abstração e simplicidade quando comparadas a consultas de metadados totalmente qualificadas e, portanto, devem ser preferenciais em casos em que o acesso a metadados de baixo nível não é necessário. No entanto, as expressões de política fornecem acesso apenas a um conjunto limitado de metadados de imagem, enquanto a linguagem de consulta de metadados fornece acesso a quase todos os metadados armazenados em um arquivo de imagem.

Resumo da linguagem de consulta de metadados

A tabela a seguir é uma definição formal da linguagem de consulta de metadados WIC. Cada símbolo gramatical representa uma expressão composta por outros símbolos. A expressão pode ser outro símbolo ou uma sequência de outros símbolos separados pela barra vertical (|), indicando uma opção "ou". A expressão inteira à direita é uma possível substituição para o símbolo especificado à esquerda.

Símbolo Expressão
<path> <name> | Caminho da propriedade '/' <>
<caminho da propriedade> <item> de metadados | < caminho> de propriedade '/' <caminho da propriedade>
<item de metadados> <nome> do índice | < nome do> item | < nome> do esquema ':' nome do <item>
<nome do esquema> <nome do item>
<nome do item> <item> de metadados | < índice de item><indexado>
<item indexado> <item> | < item de metadados implícitos><>
<metadados implícitos> '<'<name>'>'
<item> <name> | & lt;index><data> | < Dados>
<data> Valor '{' <do tipo> de dados '=' <> '}'
&lt;index> Número '[' <> | <> star ']'
<tipo de dados> 'char' | 'uchar' | 'short' | 'ushort' | 'long' | 'ulong' | 'int' | 'uint' | 'longlong' | 'ulonglong' | 'float' | 'double' | 'str' | 'wstr' | 'guid' | 'bool'
<valor de dados> <number> | < name> | < Guid>
<estrela> '*'
<number> número
<name> string
<guid> guid

 

Conceitual

Visão geral do componente de imagem do Windows

Visão geral dos metadados do WIC

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