Compartir a través de


Introducción a la descodificación progresiva

En este tema se presenta la descodificación progresiva y cómo usar la descodificación progresiva en aplicaciones. También proporciona instrucciones para crear códecs que admitan la descodificación progresiva.

En este tema se incluyen las siguientes secciones.

Introducción

La descodificación progresiva proporciona la capacidad de descodificar y representar partes incrementales de una imagen antes de que finalice la descarga de toda la imagen. Esta característica mejora considerablemente la experiencia del usuario al ver imágenes desde Internet, ya que el usuario no tiene que esperar a que se descargue toda la imagen antes de que pueda comenzar la descodificación. Los usuarios pueden ver una vista previa de imágenes con datos disponibles mucho antes de que se descargue toda la imagen. Esta característica es esencial para cualquier aplicación que se use para ver imágenes de Internet o desde orígenes de datos con ancho de banda limitado.

El componente de imágenes de Windows (WIC) en Windows 7 admite la descodificación progresiva de formatos de imagen populares, como JPEG, PNG y GIF. WIC también admite todos los códecs que no son de Microsoft habilitados para WIC que implementan la descodificación progresiva. La codificación progresiva no se admite en la versión actual de WIC. En este tema se describe la descodificación progresiva en Windows 7 y el procedimiento para habilitar la descodificación progresiva en las aplicaciones.

¿Qué es la descodificación progresiva?

La descodificación progresiva es la capacidad de descodificar incrementalmente partes de una imagen a partir de un archivo de imagen incompleto. La descodificación tradicional requiere un archivo de imagen completo antes de que pueda comenzar la descodificación. La descodificación progresiva se inicia después de que haya terminado de descargarse un nivel progresivo de una imagen. El descodificador realiza un paso de descodificación en el nivel progresivo actual de la imagen. A continuación, realiza varias pasadas de descodificación en la imagen a medida que se descarga cada nivel progresivo. Cada paso de descodificación muestra más de la imagen hasta que la imagen se descarga y descodifica por completo. El número de pases necesarios para descodificar una imagen completa depende del formato de archivo de imagen y del proceso de codificación usado para crear la imagen.

Las imágenes deben codificarse específicamente para implementar la descodificación progresiva, pero no todos los formatos de imagen lo admiten. En la lista siguiente se resumen los requisitos para usar la descodificación progresiva.

  • El archivo de imagen debe admitir la descodificación progresiva. La mayoría de los formatos de imagen no admiten la descodificación progresiva, aunque los formatos de imagen más populares JPEG, PNG y GIF sí lo hacen.
  • El archivo de imagen debe codificarse como una imagen progresiva. Los archivos de imagen que no se crearon con la codificación progresiva de imágenes no pueden implementar la descodificación progresiva, incluso cuando el formato de archivo lo admita.
  • Un códec que admita la descodificación progresiva debe estar disponible. Si un códec no admite la descodificación progresiva, una imagen codificada como una imagen progresiva se descodificará como una imagen tradicional.

Compatibilidad con la descodificación progresiva en Windows 7

Windows 7 proporciona códecs integrados que admiten la descodificación progresiva para formatos de imagen JPEG, PNG y GIF. Cada uno de estos códecs de Windows 7 realiza varios pasos de descodificación en una imagen. Cada paso corresponde a un nivel determinado y a una parte de la imagen que se descodifica, lo que eventualmente conduce a una imagen totalmente descodificada.

Cada formato de imagen controla la descodificación progresiva de una manera diferente. En la tabla siguiente se proporciona información sobre el número de niveles progresivos y el método de descodificación admitido por los formatos de descodificación progresiva de Windows 7.

Formato de imágenes Número de niveles progresivos admitidos Método de descodificación progresiva
JPEG Definido por image Aumento de la resolución
PNG 7 Entrelazado
GIF 4 Entrelazado

 

Además, la descodificación progresiva se puede implementar en códecs proporcionando compatibilidad con interfaces y métodos progresivos. Si no se admite la descodificación progresiva en un códec, se deben devolver los mensajes de error adecuados si se llama a estos métodos.

Descodificación progresiva JPEG

La descodificación progresiva JPEG presenta datos de imagen en resoluciones cada vez más altas para cada nivel, hasta que la imagen de resolución completa esté disponible. Cada nivel de la imagen se establece para proporcionar un nivel de resolución diferente. A medida que haya más niveles progresivos disponibles, la imagen se muestra en resoluciones superiores, hasta que se resuelva la imagen de resolución completa.

El número de niveles disponibles y el conjunto de resolución en cada nivel depende completamente del JPEG codificado. Las dos imágenes siguientes muestran un ejemplo de descodificación progresiva JPEG en dos niveles progresivos.

ejemplos de descodificación progresiva jpeg

La imagen de la izquierda se descodifica en el nivel progresivo 0. La imagen de la derecha se descodifica completamente después de cinco niveles progresivos.

Descodificación progresiva png/GIF

La descodificación progresiva PNG y GIF usan un método de descodificación progresiva entrelazado. El proceso de descodificación de ambos formatos es muy similar.

Descodificación progresiva png

Los archivos de imagen PNG proporcionan siete niveles progresivos para la descodificación, como se describe en la especificación PNG. La descodificación progresiva PNG se implementa mediante la descodificación de un patrón especificado de píxeles en cada paso del descodificador. El patrón de la tabla siguiente de la especificación PNG se replica en toda la imagen. Cada número representa el nivel progresivo en el que se descodificará el píxel correspondiente.

               
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

 

En la tabla anterior, puede determinar los píxeles que se descodificarán con cada paso del descodificador. A diferencia del códec GIF de Windows 7, el códec PNG de Windows 7 replica el píxel más a la izquierda disponible en una línea de examen para rellenar píxeles vacíos.

Las imágenes siguientes muestran un ejemplo del códec de descodificación progresiva png de Windows 7 en tres niveles progresivos.

ejemplos de descodificación progresiva png

La imagen de la parte superior izquierda muestra una imagen PNG descodificada en el nivel progresivo 0. La imagen superior derecha muestra la misma imagen PNG descodificada en el nivel progresivo 3. La imagen inferior muestra la misma imagen completamente descodificada después de 7 niveles progresivos.

Descodificación progresiva gif

Los archivos de imagen GIF proporcionan cuatro niveles progresivos para la descodificación, como se describe en la especificación GIF. Cada paso rellena determinadas filas dentro de una imagen, lo que genera una imagen completa después del cuarto paso. En la tabla siguiente de la especificación GIF se muestran las líneas de examen descodificadas por cada paso del descodificador.

Número de nivel/ número de paso Líneas de examen rellenadas Iniciar línea de examen
1 Cada octava línea de examen 0
2 Cada octava línea de examen 4
3 Cada cuarta línea de examen 2
4 Cada segunda línea de examen 1

 

Aunque los códecs pueden especificar el contenido de píxeles vacíos en cualquier nivel determinado, el códec GIF de Windows rellena líneas de examen vacías mediante la replicación de líneas de examen rellenadas encima de la línea de examen vacía.

Descodificación progresiva en aplicaciones

La interfaz de descodificación progresiva principal es la interfaz IWICProgressiveLevelControl . Para obtener una referencia a la interfaz, consulte un marco de imagen (IWICBitmapFrameDecode) para IWICProgressiveLevelControl. A continuación, se puede acceder a los métodos progresivos desde la interfaz .

El código siguiente proporciona un ejemplo para usar la descodificación progresiva en las aplicaciones.

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();
}

El código anterior proporciona la funcionalidad básica necesaria para implementar la descodificación progresiva en la mayoría de las aplicaciones. Con el código, se puede acceder a los niveles progresivos a medida que los datos de píxeles de imagen están disponibles. La función SetCurrentLevel bloquea la ejecución hasta que el nivel que se solicita está disponible.

Compatibilidad con códecs personalizados para la descodificación progresiva

Los desarrolladores de códecs pueden optar por implementar IWICProgressiveLevelControl si sus formatos de imagen admiten la descodificación progresiva. La compatibilidad con la descodificación progresiva no es un requisito para la detección y el arbitraje de WIC. Sin embargo, la descodificación progresiva mejora considerablemente la experiencia del usuario y la implementación se debe considerar si es posible.

Conceptual

Información general sobre el componente de creación de imágenes de Windows

Otros recursos

Compresión digital y codificación de Continuous-Tone imágenes fijas: requisitos y directrices

Formato de intercambio de archivos JPEG

Especificación GIF89a

Especificación y extensiones de gráficos de red portátiles (PNG)