Visão geral da marcação Pessoas
Este tópico apresenta o novo esquema XMP (Extensible Metadata Platform) e a propriedade de fotos do Windows 7 System.Photo.PeopleNames que permite a marcação de indivíduos em uma foto digital. Este tópico também discute como usar a API wic (componente de imagem do Windows) para ler e gravar os metadados necessários para marcação de pessoas.
Este tópico inclui as seções a seguir.
Pré-requisitos
Para entender este tópico, você deve estar familiarizado com as interfaces de decodificador wic e seus componentes 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 metadados de imagem, especialmente XMP.
Introdução
A Microsoft criou um novo esquema XMP para marcar pessoas em uma imagem digital. Esse esquema permite que os aplicativos armazenem os nomes e locais de indivíduos que estão na imagem como metadados dentro da imagem. Além do novo esquema, a nova propriedade de foto System.Photo.PeopleNames está disponível no Windows 7. Essa nova propriedade permite que os aplicativos leiam os nomes do indivíduo armazenados nos metadados da imagem. O WIC utiliza esses novos recursos permitindo que os aplicativos leiam e escrevam facilmente metadados de marcação de pessoas em fotos digitais.
Marcação de Pessoas
O WIC fornece aos desenvolvedores de aplicativos componentes COM que leem dados de imagem, bem como metadados de imagem. Para ler e gravar metadados, como o novo recurso de marcação de pessoas, o WIC fornece as interfaces IWICMetadataQueryReader e IWICMetadataQueryWriter . Essas interfaces permitem que os aplicativos usem a linguagem de consulta de metadados para gravar metadados nos quadros individuais de uma imagem. A seção a seguir demonstra como ler e gravar os metadados de marcação de pessoas nos metadados de uma imagem usando leitores e gravadores de consulta WIC.
nomes de Pessoas
Parte do recurso de marcação de pessoas é a capacidade de simplesmente obter uma lista dos nomes das pessoas marcadas dentro da imagem. Essa parte do recurso tem suporte dos manipuladores de metadados System.Photo.PeopleNames e WIC. A interface IWICMetadataQueryReader , em conjunto com a propriedade System.Photo.PeopleNames, é usada para ler os nomes das pessoas identificadas em uma imagem e armazenadas nos metadados da imagem.
O exemplo de código a seguir demonstra um leitor de consulta obtido de um quadro de imagem para consultar os metadados de uma imagem em busca de nomes marcados da propriedade System.Photo.PeopleNames .
// Not shown: image decoding, retrieving an image frame.
...
PROPVARIANT value;
IWICMetadataQueryReader *pQueryReader = NULL;
...
// Get the query reader.
if (SUCCEEDED(hr))
{
hr = pFrameDecode->GetMetadataQueryReader(&pQueryReader);
}
// Query for the System.Photo.PeopleNames property.
if (SUCCEEDED(hr))
{
// Get the property metadata by property name.
hr = pQueryReader->GetMetadataByName(L"System.Photo.PeopleNames", &value);
}
A expressão de consulta "System.Photo.PeopleNames" consulta o quadro da propriedade. Se os metadados de marcação de pessoas existirem e contiverem nomes de pessoas, o valor PROPVARIANT será definido como VT_LPWSTR e o valor de dados conterá a lista de nomes marcados. Para obter mais informações sobre como ler metadados de imagem, consulte Visão geral dos metadados de imagem de leitura e gravação.
Consultar a marca de nomes de pessoas só será útil se a imagem realmente contiver os metadados de marcação de pessoas. Para que isso ocorra, um aplicativo deve primeiro tê-lo gravado. Para escrever os metadados de nomes de pessoas, use um IWICMetadataQueryWriter e o caminho XMP explícito dos metadados. O exemplo de código a seguir demonstra o uso de um gravador de consulta para gravar um nome no caminho da consulta.
// Not shown: image encoding, retrieving/creating the image frame,
// creating the IWICImagingFactory
...
IWICImagingFactory *pFactory = NULL;
IWICMetadataQueryWriter *pQueryWriter = NULL;
...
// Get the query writer from the image frame.
if (SUCCEEDED(hr))
{
hr = pFrameEncode->GetMetadataQueryWriter(&pQueryWriter);
}
// A query writer specifically for this person's XMP struct
IWICMetadataQueryWriter *pXMPStructQueryWriter = NULL;
// Create a query writer specifically for an XMP Struct
hr = pFactory->CreateQueryWriter(
GUID_MetadataFormatXMPStruct,
NULL,
&pXMPStructQueryWriter
);
// Create a variant representing the structure created above
PROPVARIANT xmpStruct;
PropVariantInit(&xmpStruct);
// VT_UNKNOWN indicates that we're setting a COM object, in this case a XMPStruct
// which will hold the name and rectangle
xmpStruct.vt = VT_UNKNOWN;
xmpStruct.punkVal = pXMPStructQueryWriter;
if(SUCCEEDED(hr))
{
// WIC will automatically create the xmp base, the RegionInfo struct, and the Regions
// bag (an unordered array) but structs within that bag need to be explicitly created.
// The {ulong=0} in the query means to insert the new struct at the start of the bag,
// {} could also be used to insert at the end of the bag.
hr = pQueryWriter->SetMetadataByName(
L"/xmp/<xmpstruct>MP:RegionInfo/<xmpbag>MPRI:Regions/{ulong=0}",
&xmpStruct
);
}
// Set up the PROPVARIANT with the name information
PROPVARIANT personName;
PropVariantInit(&personName);
personName.vt = VT_LPWSTR;
personName.pwszVal = L"John Doe";
if(SUCCEEDED(hr))
{
// Set the name metadata
hr = pQueryWriter->SetMetadataByName(
L"/xmp/MP:RegionInfo/MPRI:Regions/{ulong=0}/MPReg:PersonDisplayName",
&personName
);
}
Observe a etapa que constrói a estrutura XMP e defini-la em MPRI:Regions/{ulong=0}
. Sem essa etapa, o WIC não pode identificar onde colocar o PersonDisplayName
posteriormente. Observe também que o caminho de consulta explícito é usado em vez de System.Photo.PeopleNames, cuja política de metadados não dá suporte à gravação de metadados.
Retângulos Pessoas
no entanto, os nomes do Pessoas são apenas parte do recurso de marcação de pessoas. Além de armazenar nomes de pessoas nos metadados, o esquema também dá suporte a informações de região que identificam a área específica (um retângulo) que a pessoa é mostrada na imagem.
As informações do retângulo são representadas por quatro valores decimais delimitados por vírgulas, como "0.25, 0.25, 0.25, 0.25". Os dois primeiros valores especificam a coordenada superior esquerda; os dois finais especificam a altura e a largura do retângulo. As dimensões da imagem para definir retângulos de pessoas são normalizadas como 1, o que significa que no exemplo "0,25, 0,25, 0,25, 0,25", o retângulo inicia 1/4 da distância da parte superior e 1/4 da distância da esquerda da imagem. A altura e a largura do retângulo são 1/4 do tamanho de suas respectivas dimensões de imagem.
As informações de retângulo que identificam indivíduos são escritas da mesma forma que os nomes das pessoas são escritos, dentro da mesma estrutura. Para gravar os metadados do retângulo, use um IWICMetadataQueryWriter e o caminho XMP explícito dos metadados. O exemplo de código a seguir continua o exemplo anterior e adiciona um retângulo que representa 'John Doe' aos metadados da imagem. Observe que ele usa o mesmo {ulong=0}
índice para associar esse retângulo a 'John Doe'.
// Set up the PROPVARIANT with the rectangle information
PROPVARIANT rectangle;
PropVariantInit(&rectangle);
rectangle.vt = VT_LPWSTR;
rectangle.pwszVal = L"0.0,0.0,0.25,0.25";
if(SUCCEEDED(hr))
{
// Set the rectangle metadata
hr = pQueryWriter->SetMetadataByName(
L"/xmp/MP:RegionInfo/MPRI:Regions/{ulong=0}/MPReg:Rectangle",
&rectangle
);
}
Referência de esquema
Os esquemas do Microsoft XMP para marcação de pessoas definem um conjunto de propriedades para marcar indivíduos em fotos digitais.
As seções a seguir fornecem as definições de esquema necessárias para marcação de pessoas. Sempre que possível, as definições de esquema usam as convenções fornecidas pelas Especificações da Plataforma extensível de metadados (XMP) da Adobe. As definições de esquema neste tópico mostram o URI (Uniform Resource Identifier) do namespace XML que identifica o esquema e o prefixo de namespace de esquema preferencial, seguido por uma tabela que lista todas as propriedades definidas para o esquema. Cada tabela tem as seguintes colunas:
Propriedade – o nome da propriedade, incluindo o prefixo de namespace preferencial.
Tipo de valor – o tipo de valor da propriedade . Os esquemas de suporte de marcação de pessoas usam os tipos de valor XMP sempre que possível, incluindo Data e Texto. Os tipos de matriz são precedidos pelo tipo de contêiner:
alt
,bag
ouseq
.Categoria – As propriedades do esquema são internas ou externas:
Os metadados internos devem ser definidos pelo aplicativo.
Os metadados externos devem ser definidos pelo usuário e são independentes do conteúdo do documento.
Descrição – a descrição da propriedade.
Esquema do Microsoft Photo 1.2
O esquema do Microsoft Photo 1.2 fornece um conjunto de propriedades para regiões de imagem.
- O URI do namespace do esquema é
https://ns.microsoft.com/photo/1.2/
. - O prefixo de namespace de esquema preferencial é
MP
.
Propriedade | Tipo de valor | Categoria | Descrição |
---|---|---|---|
MP:RegionInfo | Regioninfo | Interna | obrigatório : armazena a raiz dos metadados de marcação de pessoas. Consulte a seção Microsoft Photo RegionInfo Schema a seguir. |
Microsoft Photo RegionInfo Schema
O esquema Microsoft Photo RegionInfo 1.2 fornece um conjunto de propriedades para informações da região.
- O URI do namespace do esquema é
https://ns.microsoft.com/photo/1.2/t/RegionInfo#
. - O prefixo de namespace de esquema preferencial é
MPRI
.
Propriedade | Tipo de valor | Categoria | Descrição |
---|---|---|---|
MPRI:DateRegionsValid | Data | Externo | opcional : data em que a última região foi criada. |
MPRI:Regions | bag Região | Externo | obrigatório : armazena as regiões de marcação de pessoas. Consulte a seção Esquema de Região de Fotos da Microsoft a seguir. |
Esquema da região de fotos da Microsoft
O esquema Microsoft Photo Region 1.2 fornece um conjunto de propriedades para regiões de imagem.
- O URI do namespace do esquema é
https://ns.microsoft.com/photo/1.2/t/Region#
. - O prefixo de namespace de esquema preferencial é
MPReg
.
MPReg:Property | Tipo de valor | Categoria | Descrição |
---|---|---|---|
MPReg:PersonDisplayName | Texto | Externo | obrigatório : armazena o nome da pessoa no retângulo fornecido. |
MPReg:Rectangle | Texto | Externo | opcional : armazena o retângulo que identifica a pessoa dentro da foto. O retângulo é armazenado como quatro valores decimais delimitados por vírgulas. Os dois primeiros valores especificam a coordenada superior esquerda; os dois finais especificam a altura e a largura do retângulo. Os valores decimais devem ser normalizados como 1. |
MPReg:PersonEmailDigest | Texto | Externo | opcional : armazena o hash de mensagem criptografada SHA-1 do endereço de email ao vivo da pessoa. |
MPReg:PersonLiveIdCID | Texto | Externo | opcional : armazena a representação decimal assinada do CID Dinâmico da pessoa, um inteiro de 64 bits que identifica publicamente uma identidade dinâmica. |
Metadados de exemplo
Veja a seguir uma representação dos metadados XMP para marcação de pessoas.
<rdf:Description rdf:about="" xmlns:MP="https://ns.microsoft.com/photo/1.2/">
<MP:RegionInfo>
<rdf:Description xmlns:MPRI="https://ns.microsoft.com/photo/1.2/t/RegionInfo#">
<MPRI:Regions>
<rdf:Bag>
<rdf:li>
<rdf:Description xmlns:MPReg="https://ns.microsoft.com/photo/1.2/t/Region#">
<MPReg:Rectangle>0.790650, 0.441734, 0.209350, 0.279133
</MPReg:Rectangle>
<MPReg:PersonDisplayName>John Doe</MPReg:PersonDisplayName>
<MPReg:PersonEmailDigest>2FD4E1C67A2D28FCED849EE1BB76E7391B93EB13</MPReg:PersonEmailDigest>
<MPReg:PersonLiveIdCID>1234567890123456789</MPReg:PersonLiveIdCID>
</rdf:Description>
</rdf:li>
<rdf:li>
<rdf:Description xmlns:MPReg="https://ns.microsoft.com/photo/1.2/t/Region#">
<MPReg:Rectangle>0.222656, 0.302083, 0.378906, 0.505208</MPReg:Rectangle>
<MPReg:PersonDisplayName>Jane Doe</MPReg:PersonDisplayName>
</rdf:Description>
</rdf:li>
<!-- Addition Regions --> ...
<rdf:li>...
</rdf:li>
</rdf:Bag>
</MPRI:Regions> </rdf:Description> </MP:RegionInfo> </rdf:Description>
Tópicos relacionados
-
Conceitual