Partager via


Vue d’ensemble du décodage progressif

Cette rubrique présente le décodage progressif et comment utiliser le décodage progressif dans les applications. Il fournit également des instructions pour la création de codecs qui prennent en charge le décodage progressif.

Cette rubrique contient les sections suivantes.

Introduction

Le décodage progressif offre la possibilité de décoder et de restituer de manière incrémentielle des parties d’une image avant la fin du téléchargement de l’image entière. Cette fonctionnalité améliore considérablement l’expérience de l’utilisateur lors de l’affichage d’images à partir d’Internet, car l’utilisateur n’a pas à attendre que l’image entière soit téléchargée avant que le décodage puisse commencer. Les utilisateurs peuvent voir un aperçu d’image avec les données disponibles bien avant le téléchargement de l’image entière. Cette fonctionnalité est essentielle pour toute application utilisée pour afficher des images à partir d’Internet ou de sources de données avec une bande passante limitée.

Le composant WiC (Windows Imaging Component) dans Windows 7 prend en charge le décodage progressif des formats d’image populaires tels que JPEG, PNG et GIF. WIC prend également en charge tous les codecs non Microsoft compatibles WIC qui implémentent le décodage progressif. L’encodage progressif n’est pas pris en charge dans la version actuelle de WIC. Cette rubrique décrit le décodage progressif dans Windows 7 et la procédure d’activation du décodage progressif dans vos applications.

Qu’est-ce que le décodage progressif ?

Le décodage progressif est la possibilité de décoder de manière incrémentielle des parties d’une image à partir d’un fichier image incomplet. Le décodage traditionnel nécessite un fichier image complet avant que le décodage puisse commencer. Le décodage progressif démarre une fois le téléchargement progressif d’une image terminé. Le décodeur effectue un passage de décodage sur le niveau progressif actuel de l’image. Il effectue ensuite plusieurs passes de décodage sur l’image à mesure que chaque niveau progressif est téléchargé. Chaque passe de décodage révèle davantage de l’image jusqu’à ce que l’image soit entièrement téléchargée et décodée. Le nombre de passes requises pour décoder une image complète dépend du format du fichier image et du processus d’encodage utilisé pour créer l’image.

Les images doivent être spécifiquement encodées pour implémenter le décodage progressif, mais tous les formats d’image ne le prennent pas en charge. La liste suivante récapitule les conditions requises pour l’utilisation du décodage progressif.

  • Le fichier image doit prendre en charge le décodage progressif. La plupart des formats d’image ne prennent pas en charge le décodage progressif, bien que les formats d’image populaires JPEG, PNG et GIF le font.
  • Le fichier image doit être encodé en tant qu’image progressive. Les fichiers image qui n’ont pas été créés avec l’encodage progressif de l’image ne peuvent pas implémenter le décodage progressif, même si le format de fichier le prend en charge.
  • Un codec qui prend en charge le décodage progressif doit être disponible. Si un codec ne prend pas en charge le décodage progressif, une image encodée en tant qu’image progressive est décodée en tant qu’image traditionnelle.

Prise en charge du décodage progressif dans Windows 7

Windows 7 fournit des codecs intégrés qui prennent en charge le décodage progressif pour les formats d’image JPEG, PNG et GIF. Chacun de ces codecs Windows 7 effectue plusieurs passes de décodage sur une image. Chaque passe correspond à un niveau particulier et à une partie de l’image qui est décodée, ce qui aboutit finalement à une image entièrement décodée.

Chaque format d’image gère le décodage progressif d’une manière différente. Le tableau suivant fournit des informations sur le nombre de niveaux progressifs et la méthode de décodage prise en charge par les formats de décodage progressif Windows 7.

Format d'image Nombre de niveaux progressifs pris en charge Méthode de décodage progressif
JPEG Défini par image Augmentation de la résolution
PNG 7 Entrelacement
GIF 4 Entrelacement

 

En outre, le décodage progressif peut être implémenté dans les codecs en fournissant la prise en charge des interfaces et méthodes progressives. Si le décodage progressif n’est pas pris en charge dans un codec, des messages d’erreur appropriés doivent être retournés si ces méthodes sont appelées.

Décodage progressif JPEG

Le décodage progressif JPEG présente les données d’image à des résolutions de plus en plus élevées pour chaque niveau, jusqu’à ce que l’image de résolution complète soit disponible. Chaque niveau de l’image est défini pour fournir un niveau de résolution différent. À mesure que des niveaux plus progressifs deviennent disponibles, l’image est affichée à des résolutions plus élevées, jusqu’à ce que l’image de résolution complète soit résolue.

Le nombre de niveaux disponibles et la résolution définie à chaque niveau dépendent entièrement du jpeg encodé. Les deux images suivantes montrent un exemple de décodage progressif JPEG à deux niveaux progressifs.

exemples de décodage progressif jpeg

L’image à gauche est décodée au niveau progressif 0. L’image à droite est entièrement décodée après cinq niveaux progressifs.

Décodage progressif PNG/GIF

Le décodage progressif PNG et GIF utilise une méthode de décodage progressif entrelacée. Le processus de décodage pour les deux formats est très similaire.

Décodage progressif PNG

Les fichiers image PNG fournissent sept niveaux progressifs pour le décodage, comme décrit dans la spécification PNG. Le décodage progressif PNG est implémenté en décodant un modèle spécifié de pixels sur chaque passe du décodeur. Le modèle du tableau suivant de la spécification PNG est répliqué sur l’image entière. Chaque nombre représente le niveau progressif dans lequel le pixel correspondant sera décodé.

               
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

 

Dans le tableau ci-dessus, vous pouvez déterminer les pixels qui seront décodés à chaque passage du décodeur. Contrairement au codec GIF Windows 7, le codec PNG Windows 7 réplique le pixel le plus à gauche disponible sur une ligne d’analyse pour remplir les pixels vides.

Les images suivantes montrent un exemple de codec de décodage progressif PNG Windows 7 à trois niveaux progressifs.

exemples de décodage progressif png

L’image en haut à gauche montre une image PNG décodée au niveau progressif 0. L’image en haut à droite montre la même image PNG décodée au niveau progressif 3. L’image inférieure montre la même image entièrement décodée après 7 niveaux progressifs.

Décodage progressif GIF

Les fichiers image GIF fournissent quatre niveaux progressifs pour le décodage, comme décrit dans la spécification GIF. Chaque passe remplit certaines lignes d’une image, produisant une image complète après la quatrième passe. Le tableau suivant de la spécification GIF montre quelles lignes d’analyse sont décodées à chaque passage du décodeur.

Numéro de niveau/numéro de passe Lignes d’analyse remplies Ligne d’analyse de démarrage
1 Chaque huitième ligne d’analyse 0
2 Chaque huitième ligne d’analyse 4
3 Chaque quatrième ligne d’analyse 2
4 Chaque ligne d’analyse sur deux 1

 

Bien que les codecs puissent spécifier le contenu de pixels vides à n’importe quel niveau, le codec GIF Windows remplit les lignes d’analyse vides en répliquant les lignes d’analyse remplies au-dessus de la ligne d’analyse vide.

Décodage progressif dans les applications

L’interface de décodage progressif main est l’interface IWICProgressiveLevelControl. Pour obtenir une référence à l’interface, interrogez une image frame (IWICBitmapFrameDecode) pour IWICProgressiveLevelControl. Les méthodes progressives sont ensuite accessibles à partir de l’interface.

Le code ci-dessous fournit un exemple d’utilisation du décodage progressif dans les applications.

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

Le code précédent fournit les fonctionnalités de base nécessaires pour implémenter le décodage progressif dans la plupart des applications. À l’aide du code, les niveaux progressifs sont accessibles à mesure que les données de pixels d’image deviennent disponibles. La fonction SetCurrentLevel bloque l’exécution jusqu’à ce que le niveau demandé soit disponible.

Prise en charge du codec personnalisé pour le décodage progressif

Les développeurs de codecs peuvent choisir d’implémenter IWICProgressiveLevelControl si leurs formats d’image prennent en charge le décodage progressif. La prise en charge du décodage progressif n’est pas requise pour la découverte et l’arbitrage par WIC. Toutefois, le décodage progressif améliore considérablement l’expérience utilisateur et l’implémentation doit être envisagée si possible.

Conceptuel

Vue d’ensemble du composant d’acquisition d’images Windows

Autres ressources

Compression numérique et codage d’images fixes Continuous-Tone - Exigences et recommandations

Format d’échange de fichiers JPEG

Spécification GIF89a

Spécification et extensions PNG (Portable Network Graphics)