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 suportam decodificação progressiva.
Este tópico contém as seguintes seções.
- Introdução
- O que é a Decodificação Progressiva?
- Suporte de decodificação progressiva no Windows 7
- Descodificação Progressiva de JPEG
- / Descodificação Progressiva de PNG/GIF
- Descodificação Progressiva em Aplicações
- Suporte de Codec Personalizado para Decodificação Progressiva
- Tópicos relacionados
Introdução
A decodificação progressiva fornece a capacidade de decodificar e renderizar incrementalmente partes de uma imagem antes que o download da imagem inteira tenha terminado. Este recurso melhora muito a experiência do usuário ao visualizar imagens da Internet, porque o usuário não precisa esperar que a imagem inteira seja baixada antes que a decodificação possa começar. Os usuários podem ver uma visualização de imagem com dados disponíveis muito antes de toda a imagem ser baixada. Este recurso é essencial para qualquer aplicativo usado para visualizar imagens da Internet ou de fontes de dados com largura de banda limitada.
O Windows Imaging Component (WIC) no Windows 7 suporta a decodificação progressiva de formatos de imagem populares, como JPEG, PNG e GIF. O WIC também suporta quaisquer codecs não Microsoft compatíveis com WIC que implementem decodificação progressiva. A codificação progressiva não é suportada 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 é a Descodificação Progressiva?
A decodificação progressiva é a capacidade de decodificar incrementalmente partes de uma imagem a partir 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 descodificação progressiva começa após o download de um nível progressivo de uma imagem. 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 à medida que cada nível progressivo é baixado. Cada passo de decodificação revela mais da imagem até que a imagem seja totalmente baixada e decodificada. O número de passagens necessárias 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 especificamente codificadas para implementar a decodificação progressiva, mas nem todos os formatos de imagem oferecem suporte a ela. A lista a seguir resume os requisitos para usar a decodificação progressiva.
- O arquivo de imagem deve suportar a decodificação progressiva. A maioria dos formatos de imagem não suporta 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 ficheiros de imagem que não foram criados com a codificação progressiva de imagem não podem implementar a descodificação progressiva, mesmo quando o formato de ficheiro o suportaria.
- Um codec que suporte a decodificação progressiva deve estar disponível. Se um codec não suportar a decodificação progressiva, uma imagem codificada como uma imagem progressiva será decodificada como uma imagem tradicional.
Suporte de decodificação progressiva no Windows 7
O Windows 7 fornece codecs internos que suportam 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 suportado pelos formatos de decodificação progressiva do Windows 7.
Formato de imagem | Número de níveis progressivos suportados | Método de descodificação progressiva |
---|---|---|
JPEG | Definido por Imagem | Aumentar 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 a decodificação progressiva não for suportada em um codec, as mensagens de erro apropriadas deverão ser retornadas se esses métodos forem chamados.
Descodificação progressiva JPEG
A descodificaçã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 total 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 total seja resolvida.
O número de níveis disponíveis e a resolução definida 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.
A imagem à esquerda é decodificada no nível progressivo 0. A imagem à direita é totalmente decodificada após cinco níveis progressivos.
Descodificação progressiva PNG/GIF
Tanto a decodificação progressiva PNG quanto a GIF usam um método de decodificação progressiva entrelaçado. O processo de descodificação para ambos os formatos é muito semelhante.
Descodificação progressiva PNG
Os arquivos de imagem PNG fornecem sete níveis progressivos para decodificação, conforme descrito na especificação PNG. A descodificação progressiva PNG é implementada através da descodificação de um padrão especificado de píxeis em cada passagem do descodificador. 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 numa linha de varredura 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.
A imagem no canto superior esquerdo mostra uma imagem PNG decodificada no nível progressivo 0. A imagem no canto superior direito 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 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 varredura são decodificadas por cada passagem do decodificador.
Número de nível/número de passe | Linhas de digitalização preenchidas | Linha de verificação inicial |
---|---|---|
1 | Cada oitava linha de varredura | 0 |
2 | Cada oitava linha de varredura | 4 |
3 | A cada quatro linhas de varredura | 2 |
4 | A cada segunda linha de varredura | 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 aplicações
A principal interface de descodificação progressiva é a interface IWICProgressiveLevelControl. Para obter uma referência à interface, solicite um quadro de imagem (IWICBitmapFrameDecode) para IWICProgressiveLevelControl. Os métodos progressivos podem ser acessados a partir da interface.
O código abaixo fornece um exemplo para o uso da 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 da imagem ficam 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 de codec podem optar por implementar o IWICProgressiveLevelControl se seus formatos de imagem suportarem decodificação progressiva. O suporte para decodificação progressiva não é um requisito para descoberta e arbitragem pelo WIC. No entanto, a decodificação progressiva melhora muito a experiência do usuário, e a implementação deve ser considerada, se possível.
Tópicos relacionados
-
Conceptual
-
Visão geral do Windows Imaging Component
-
Outros recursos
-
Compressão Digital e Codificação de Continuous-Tone Imagens Estáticas - Requisitos e Diretrizes