Compartilhar via


Visão geral da decodificação progressiva

Este tópico apresenta a decodificação progressiva e como usar a decodificação progressiva em aplicativos. Ele também fornece diretrizes para a criação de codecs que dão suporte à decodificação progressiva.

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

Introdução

A decodificação progressiva fornece a capacidade de decodificar e renderizar incrementalmente partes de uma imagem antes que toda a imagem termine de ser baixada. Esse recurso melhora muito a experiência do usuário ao exibir imagens da Internet, pois o usuário não precisa esperar que toda a imagem seja baixada antes que a decodificação possa começar. Os usuários podem ver uma visualização de imagem com os dados disponíveis muito antes de toda a imagem ser baixada. Esse recurso é essencial para qualquer aplicativo usado para exibir imagens da Internet ou de fontes de dados com largura de banda limitada.

O COMPONENTE de Imagem do Windows (WIC) no Windows 7 dá suporte à decodificação progressiva de formatos de imagem populares, como JPEG, PNG e GIF. O WIC também dá suporte a quaisquer codecs não Microsoft habilitados para WIC que implementem a decodificação progressiva. Não há suporte para codificação progressiva na versão atual do WIC. Este tópico descreve a decodificação progressiva no Windows 7 e o procedimento para habilitar a decodificação progressiva em seus aplicativos.

O que é Decodificação Progressiva?

A decodificação progressiva é a capacidade de decodificar incrementalmente partes de uma imagem de um arquivo de imagem incompleto. A decodificação tradicional requer um arquivo de imagem completo antes que a decodificação possa começar. A decodificação progressiva começa depois que um nível progressivo de uma imagem termina de ser baixado. O decodificador executa uma passagem de decodificação no nível progressivo atual da imagem. Em seguida, ele executa várias passagens de decodificação na imagem conforme cada nível progressivo é baixado. Cada passagem de decodificação revela mais da imagem até que a imagem seja totalmente baixada e decodificada. O número de passes necessários para decodificar uma imagem completa depende do formato do arquivo de imagem e do processo de codificação usado para criar a imagem.

As imagens devem ser codificadas especificamente para implementar a decodificação progressiva, mas nem todos os formatos de imagem dão suporte a ela. A lista a seguir resume os requisitos para usar a decodificação progressiva.

  • O arquivo de imagem deve dar suporte à decodificação progressiva. A maioria dos formatos de imagem não dá suporte à decodificação progressiva, embora os formatos de imagem populares JPEG, PNG e GIF o façam.
  • O arquivo de imagem deve ser codificado como uma imagem progressiva. Os arquivos de imagem que não foram criados com a codificação progressiva de imagem não podem implementar a decodificação progressiva, mesmo quando o formato de arquivo de outra forma ofereceria suporte a ela.
  • Um codec que dá suporte à decodificação progressiva deve estar disponível. Se um codec não der suporte à decodificação progressiva, uma imagem codificada como uma imagem progressiva será decodificada como uma imagem tradicional.

Suporte à decodificação progressiva no Windows 7

O Windows 7 fornece codecs internos que dão suporte à decodificação progressiva para formatos de imagem JPEG, PNG e GIF. Cada um desses codecs do Windows 7 executa várias passagens de decodificação em uma imagem. Cada passagem corresponde a um determinado nível e parte da imagem que é decodificada, eventualmente levando a uma imagem totalmente decodificada.

Cada formato de imagem lida com a decodificação progressiva de uma maneira diferente. A tabela a seguir fornece informações sobre o número de níveis progressivos e o método de decodificação compatível com os formatos de decodificação progressiva do Windows 7.

Formato de imagem Número de níveis progressivos com suporte Método progressivo de decodificação
JPEG Definido por Imagem Aumentando a resolução
PNG 7 Entrelaçamento
GIF 4 Entrelaçamento

 

Além disso, a decodificação progressiva pode ser implementada em codecs fornecendo suporte para interfaces e métodos progressivos. Se não houver suporte para a decodificação progressiva em um codec, as mensagens de erro apropriadas deverão ser retornadas se esses métodos forem chamados.

Decodificação progressiva jpeg

A decodificação progressiva jpeg apresenta dados de imagem em resoluções cada vez mais altas para cada nível, até que a imagem de resolução completa esteja disponível. Cada nível da imagem é definido para fornecer um nível de resolução diferente. À medida que níveis mais progressivos se tornam disponíveis, a imagem é exibida em resoluções mais altas, até que a imagem de resolução completa seja resolvida.

O número de níveis disponíveis e o conjunto de resolução em cada nível dependem inteiramente do JPEG codificado. As duas imagens a seguir mostram um exemplo de decodificação progressiva jpeg em dois níveis progressivos.

exemplos de decodificação progressiva jpeg

A imagem à esquerda é decodificada no nível progressivo 0. A imagem à direita é totalmente decodificada após cinco níveis progressivos.

Decodificação progressiva PNG/GIF

A decodificação progressiva PNG e GIF usa um método de decodificação progressiva entrelaçado. O processo de decodificação para ambos os formatos é muito semelhante.

Decodificação progressiva png

Os arquivos de imagem PNG fornecem sete níveis progressivos para decodificação, conforme descrito na especificação PNG. A decodificação progressiva png é implementada decodificando um padrão especificado de pixels em cada passagem do decodificador. O padrão na tabela a seguir da especificação PNG é replicado em toda a imagem. Cada número representa o nível progressivo no qual o pixel correspondente será decodificado.

               
1 6 4 6 2 6 4 6
7 7 7 7 7 7 7 7
5 6 5 6 5 6 5 6
7 7 7 7 7 7 7 7
3 6 4 6 3 6 4 6
7 7 7 7 7 7 7 7
5 6 5 6 5 6 5 6
7 7 7 7 7 7 7 7

 

Na tabela acima, você pode determinar os pixels que serão decodificados com cada passagem do decodificador. Ao contrário do codec GIF do Windows 7, o codec PNG do Windows 7 replica o pixel mais à esquerda disponível em uma linha de verificação para preencher pixels vazios.

As imagens a seguir mostram um exemplo do codec de decodificação progressiva png do Windows 7 em três níveis progressivos.

exemplos de decodificação progressiva png

A imagem no canto superior esquerdo mostra uma imagem PNG decodificada no nível progressivo 0. A imagem superior direita mostra a mesma imagem PNG decodificada no nível progressivo 3. A imagem inferior mostra a mesma imagem totalmente decodificada após 7 níveis progressivos.

Decodificação progressiva de GIF

Os arquivos de imagem GIF fornecem quatro níveis progressivos para decodificação, conforme descrito na especificação GIF. Cada passagem preenche determinadas linhas dentro de uma imagem, produzindo uma imagem completa após a quarta passagem. A tabela a seguir da especificação GIF mostra quais linhas de verificação são decodificadas por cada passagem do decodificador.

Número de nível/número de passagem Linhas de verificação preenchidas Iniciando a linha de verificação
1 A cada oitava linha de verificação 0
2 A cada oitava linha de verificação 4
3 A cada quarta linha de verificação 2
4 Cada segunda linha de verificação 1

 

Embora os codecs possam especificar o conteúdo de pixels vazios em qualquer nível específico, o codec GIF do Windows preenche linhas de verificação vazias replicando linhas de verificação preenchidas acima da linha de verificação vazia.

Decodificação progressiva em aplicativos

A interface de decodificação progressiva main é a interface IWICProgressiveLevelControl. Para obter uma referência à interface, consulte um quadro de imagem (IWICBitmapFrameDecode) para IWICProgressiveLevelControl. Os métodos progressivos podem ser acessados na interface .

O código a seguir fornece um exemplo para usar a decodificação progressiva em aplicativos.

IWICProgressiveLevelControl *pProgressive = NULL;

HRESULT hr = (pBitmapFrame->QueryInterface(
   IID_IWICProgressiveLevelControl, 
   (void**) &pProgressive));
                
if (SUCCEEDED(hr))
{
   for (UINT uCurrentLevel = 0; SUCCEEDED(hr); uCurrentLevel++)
   {
      hr = pProgressive->SetCurrentLevel(uCurrentLevel);
               if (WINCODEC_ERR_INVALIDPROGRESSIVELEVEL == hr)
      {
         // No more levels
         break;
      }

      if (SUCCEEDED(hr))
      {
         // Output the current level
         hr = pBitmapFrame->CopyPixels(...);
      }                      
   }
}

if (pProgressive)
{
   pProgressive->Release();
}

O código anterior fornece a funcionalidade básica necessária para implementar a decodificação progressiva na maioria dos aplicativos. Usando o código, os níveis progressivos podem ser acessados à medida que os dados de pixel de imagem se tornam disponíveis. A função SetCurrentLevel bloqueia a execução até que o nível que está sendo solicitado esteja disponível.

Suporte a codec personalizado para decodificação progressiva

Os desenvolvedores do Codec poderão optar por implementar o IWICProgressiveLevelControl se os formatos de imagem derem suporte à decodificação progressiva. O suporte para decodificação progressiva não é um requisito para descoberta e arbitragem por WIC. No entanto, a decodificação progressiva aprimora muito a experiência do usuário e a implementação deve ser considerada, se possível.

Conceitual

Visão geral do componente de imagem do Windows

Outros recursos

Compactação digital e codificação de imagens ainda Continuous-Tone – Requisitos e diretrizes

Formato de intercâmbio de arquivos JPEG

Especificação GIF89a

Especificação e extensões PNG (Elementos Gráficos de Rede Portáteis)