Como funciona o Componente de Imagem do Windows

Descoberta e arbitragem

Antes que uma imagem possa ser decodificada, um codec apropriado deve ser encontrado que possa decodificar esse formato de imagem. Na maioria dos sistemas, como os formatos de imagem com suporte são embutidos em código, nenhum processo de descoberta é necessário. Como a plataforma WIC (Componente de Imagens do Windows) é extensível, é necessário poder identificar o formato de uma imagem e combiná-la com um codec apropriado.

Para dar suporte à descoberta em tempo de execução, cada formato de imagem deve ter um padrão de identificação que possa ser usado para identificar o decodificador apropriado para esse formato. (É altamente recomendável que, para novos formatos de arquivo, você use um GUID para o padrão de identificação, pois é garantido que ele seja exclusivo.) O padrão de identificação deve ser inserido em cada arquivo de imagem que esteja em conformidade com esse formato de imagem. Cada decodificador tem uma entrada do Registro que especifica o padrão de identificação ou os padrões dos formatos de imagem que ele pode decodificar. Quando um aplicativo precisa abrir uma imagem, ele solicita um decodificador do WIC. O WIC pesquisa os decodificadores disponíveis no registro e verifica cada entrada do Registro para obter um padrão de identificação que corresponda ao padrão inserido no arquivo de imagem. Para obter mais informações sobre entradas de registro do decodificador, consulte Entradas do Registro específicas do codificador

Quando o WIC encontra um único decodificador que corresponde ao padrão de identificação na imagem, ele cria uma instância do decodificador e passa o arquivo de imagem para ele. Se o WIC encontrar mais de uma correspondência, ele invocará um método chamado QueryCapability em cada decodificador correspondente para arbitrar entre eles e encontrar a melhor correspondência. Para obter mais informações, consulte a seção QueryCapabilities na seção Implementando IWICBitmapDecoder.

Decodificação

Depois que o decodificador apropriado tiver sido selecionado e instanciado, o aplicativo se comunica diretamente com o decodificador. O decodificador tem várias responsabilidades, que implementa por meio de várias interfaces. Esses serviços podem ser classificados como:

  • Serviços no nível do contêiner
  • Serviços de nível de quadro
  • Serviços de enumeração de metadados
  • Transformações do decodificador nativo
  • Notificações de progresso e suporte a cancelamento
  • Serviços de processamento bruto

Os serviços de nível de contêiner incluem recuperar a miniatura de nível superior (se houver suporte), visualização, contextos de cores, paleta (se aplicável) e formato de contêiner, além de fornecer acesso aos quadros de imagem individuais dentro do contêiner. (Alguns contêineres contêm apenas um único quadro, enquanto outros, como TIFF (Formato de Arquivo de Imagem Marcado), podem conter vários quadros.) Esse conjunto de serviços também inclui fornecer informações sobre o próprio decodificador e seus recursos em relação a um arquivo de imagem específico.

Quadros individuais têm suas próprias miniaturas e também podem ter seus próprios contextos de cores, paletas e outras propriedades, que são expostas no nível do quadro. A operação mais importante executada no nível do quadro, no entanto, é a decodificação real dos bits de imagem para esse quadro.

O WIC fornece leitores de metadados para os formatos de metadados mais comuns (IFD, EXIF, IPTC, XMP, APP0, APP1 e outros formatos) e também dá suporte à extensibilidade para formatos de metadados de terceiros. Isso libera o codec da responsabilidade de analisar metadados. No entanto, o codec é responsável por enumerar os blocos de metadados e solicitar um leitor de metadados para cada bloco. O WIC executa a descoberta para manipuladores de metadados da mesma forma que faz para codecs, com base em um padrão no cabeçalho de bloco que corresponde a um padrão na entrada do Registro do manipulador de metadados. Para obter mais informações, consulte As Entradas do Registro Específicas do Codificador

Os decodificadores não são necessários para dar suporte nativo a operações de transformação, mas isso permite otimizações significativas de desempenho que fornecem uma melhor experiência do usuário final. Por exemplo, um aplicativo pode criar um pipeline de várias transformações (dimensionamento, corte, rotação e conversão de formato de pixel) para executar em uma imagem antes que a imagem seja renderizada. Para obter mais informações sobre pipelines de transformação, consulte IWICBitmapSource. Depois de criar um pipeline de transformação, o aplicativo solicita a transformação final no pipeline para produzir o bitmap resultante da aplicação de todas as transformações à origem da imagem. Nesse ponto, se o próprio decodificador for capaz de executar operações de transformação, o WIC perguntará quais das transformações solicitadas ele pode executar. Todas as transformações solicitadas que o decodificador não pode executar serão executadas pelo WIC na imagem decodificada antes de retorná-la ao chamador. Esse pipeline de transformação otimizado fornece melhor desempenho do que executar cada transformação sequencialmente na memória, especialmente quando algumas ou todas as transformações podem ser realizadas durante o processo de decodificação.

As notificações de progresso e o suporte ao cancelamento permitem que um aplicativo solicite notificações de progresso para operações demoradas e também permita que o aplicativo dê ao usuário a oportunidade de cancelar uma operação que está demorando muito. Isso é importante porque, se um usuário não puder cancelar uma operação, ele poderá sentir que o processo foi suspenso e tentar cancelá-lo fechando o aplicativo.

Essas interfaces são descritas em detalhes na seção Sobre como implementar um decodificador habilitado para WIC.

Os serviços de processamento bruto incluem ajustar as configurações da câmera, como exposição, contraste e nitidez, ou alterar o espaço de cor antes de processar os bits brutos.

Codificação

Assim como os decodificadores, os codificadores têm responsabilidades que implementam por meio de interfaces. Os serviços que os codificadores fornecem são complementares aos serviços fornecidos pelos decodificadores, exceto que eles gravam dados de imagem em vez de lê-los. Os codificadores também fornecem serviços nas seguintes categorias:

  • Serviços no nível do contêiner
  • Serviços de nível de quadro
  • Enumeração de metadados e serviços de atualização
  • Suporte a notificação de progresso e cancelamento

Os serviços de nível de contêiner para um codificador incluem a configuração da miniatura de nível superior (se compatível), a visualização e a paleta (se aplicável) e a iteração por meio dos quadros de imagem individuais para que possam ser serializados no contêiner.

Os serviços de nível de quadro para um codificador espelho aqueles para o decodificador, exceto que eles gravam os dados da imagem, a miniatura e qualquer paleta associada ou outro componente, em vez de lê-los.

Além disso, os serviços de enumeração de metadados para um codificador incluem iterar pelos blocos de metadados a serem gravados e invocar os gravadores de metadados apropriados para serializar os metadados para o disco.

Essas interfaces são descritas em detalhes na seção sobre Como implementar um codificador habilitado para WIC.

O tempo de vida de um codec

Um codec wic é instanciado para lidar com uma única imagem e geralmente tem um tempo de vida curto. Ele é criado quando uma imagem é carregada e é liberada quando a imagem é fechada. Um aplicativo pode usar um grande número de codecs simultaneamente com tempos de vida sobrepostos (pense em rolar por um diretório que contém centenas de imagens) e vários aplicativos podem estar fazendo isso ao mesmo tempo.

Embora alguns codecs tenham um tempo de vida com escopo para o tempo de vida do processo em que eles residem, esse não é o caso com codecs WIC. A Galeria de Fotos do Windows Vista, o Windows Explorer e o Visualizador de Fotos, bem como vários outros aplicativos, são criados no WIC e usarão seu codec para exibir imagens e miniaturas. Se o tempo de vida do codec fosse definido para o tempo de vida do processo, sempre que uma imagem ou miniatura fosse exibida no Explorer do Windows Vista, o codec instanciado para decodificar essa imagem permaneceria na memória até a próxima vez que o usuário reiniciasse o computador. Se o codec nunca for descarregado, seus recursos serão, de fato, "vazados" porque não podem ser usados por nenhum outro componente no sistema.

Como habilitar um codec por WIC

  1. Implemente uma classe de decodificador no nível do contêiner e uma classe de decodificador no nível do quadro que expõe as interfaces WIC necessárias para decodificar imagens e iterar por meio de blocos de metadados. Isso permite que todos os aplicativos baseados em WIC interajam com seu codec da mesma forma que interagem com formatos de imagem padrão.
  2. Implemente uma classe de codificador no nível do contêiner e uma classe de codificador no nível do quadro que expõe as interfaces WIC necessárias para codificar imagens e serializar blocos de metadados em um arquivo de imagem.
  3. Se o formato de contêiner não for baseado em um contêiner TIFF ou JPEG, talvez seja necessário gravar manipuladores de metadados para os formatos de metadados comuns (EXIF, XMP). No entanto, se você usar um formato de contêiner baseado em TIFF ou JPEG, isso não será necessário porque você poderá delegar aos manipuladores de metadados fornecidos pelo sistema.
  4. Insira um padrão de identificação exclusivo (recomendamos um GUID) em todos os seus arquivos de imagem. Isso permite que o formato de imagem seja correspondido com o codec durante a descoberta. Se você estiver escrevendo um wrapper WIC para um formato de imagem existente, deverá encontrar um padrão de bits que o codificador sempre grava em seus arquivos de imagem exclusivos para esse formato de imagem e usá-lo como o padrão de identificação.)
  5. Registre seu codec no momento da instalação. Isso permite que o codec seja descoberto em tempo de execução, correspondendo ao padrão de identificação no registro com o padrão inserido no arquivo de imagem.
  6. A partir do Windows 7, o WIC exige que os codecs sejam do tipo de apartamento COM "Ambos". Isso significa que você deve fazer o bloqueio apropriado para lidar com chamadores e chamadores entre apartamentos em cenários com vários threads. Para obter mais informações, consulte a próxima seção sobre suporte a apartment multi-threaded.
  7. Suporte para plataformas de 64 bits: para o Windows 7, o WIC exigirá que os codecs WIC de terceiros sejam entregues como binários nativos de 32 e 64 bits. Além disso, o formulário de 32 bits deve instalar e executar em sistemas de 64 bits, e o instalador de codec do Windows 7 de terceiros deve instalar os binários de 32 e 64 bits em sistemas de 64 bits.

Suporte a apartment multi-threaded no WIC

Objetos em um MTA (Multi-Threaded Apartment) podem ser chamados simultaneamente por qualquer número de threads dentro do MTA. Isso permite um melhor desempenho em sistemas de vários núcleos e em determinados cenários de servidor. Além disso, os codecs WIC em um MTA podem chamar outros objetos no MTA sem o custo de marshaling associado à chamada entre threads em diferentes apartamentos STA. No Windows 7, todos os codecs WIC in-box foram atualizados para dar suporte a MTAs, incluindo JPEG, TIFF, PNG, GIF, ICO e BMP. É altamente recomendável que codecs de terceiros sejam gravados para dar suporte a MTAs. Codecs de terceiros que não dão suporte a MTAs causam custos significativos de desempenho em aplicativos multi-threaded devido ao marshaling. Habilitar o suporte ao MTA requer que a sincronização adequada seja implementada no codec de terceiros. A implementação exata dessas técnicas de sincronização está além do escopo deste artigo. Para obter mais informações sobre como sincronizar objetos COM, consulte Noções básicas e uso de modelos de threading COM.

Conceitual

Introdução (como escrever um codec habilitado para WIC)

Implementando um decodificador habilitado para WIC

Como escrever um codec habilitado para WIC

Visão geral do Componente de Imagens do Windows

Visão geral dos metadados do WIC