Condividi tramite


Panoramica della decodifica progressiva

Questo argomento presenta la decodifica progressiva e come usare la decodifica progressiva nelle applicazioni. Fornisce inoltre linee guida per la creazione di codec che supportano la decodifica progressiva.

Questo argomento contiene le sezioni seguenti.

Introduzione

La decodifica progressiva consente di decodificare e eseguire il rendering incrementale di parti di un'immagine prima del completamento del download dell'intera immagine. Questa funzionalità migliora notevolmente l'esperienza dell'utente durante la visualizzazione di immagini da Internet, perché l'utente non deve attendere il download dell'intera immagine prima che la decodifica possa iniziare. Gli utenti sono in grado di visualizzare un'anteprima dell'immagine con dati disponibili a lungo prima del download dell'intera immagine. Questa funzionalità è essenziale per qualsiasi applicazione usata per visualizzare immagini da Internet o da origini dati con larghezza di banda limitata.

Windows Imaging Component (WIC) in Windows 7 supporta la decodifica progressiva dei formati di immagine più diffusi, ad esempio JPEG, PNG e GIF. WIC supporta anche tutti i codec non Microsoft abilitati per WIC che implementano la decodifica progressiva. La codifica progressiva non è supportata nella versione corrente di WIC. Questo argomento illustra la decodifica progressiva in Windows 7 e la procedura per abilitare la decodifica progressiva nelle applicazioni.

Che cos'è la decodifica progressiva?

La decodifica progressiva è la possibilità di decodificare in modo incrementale parti di un'immagine da un file di immagine incompleto. La decodifica tradizionale richiede un file di immagine completo prima di iniziare la decodifica. La decodifica progressiva inizia dopo il download di un livello progressivo di un'immagine. Il decodificatore esegue un passaggio di decodifica sul livello progressivo corrente dell'immagine. Esegue quindi più passaggi di decodifica sull'immagine quando viene scaricato ogni livello progressivo. Ogni passaggio di decodifica rivela più dell'immagine fino a quando l'immagine non viene completamente scaricata e decodificata. Il numero di passaggi necessari per decodificare un'immagine completa dipende dal formato del file di immagine e dal processo di codifica usato per creare l'immagine.

Le immagini devono essere codificate in modo specifico per implementare la decodifica progressiva, ma non tutti i formati di immagine lo supportano. L'elenco seguente riepiloga i requisiti per l'uso della decodifica progressiva.

  • Il file di immagine deve supportare la decodifica progressiva. La maggior parte dei formati di immagine non supporta la decodifica progressiva, anche se i formati di immagine JPEG, PNG e GIF più diffusi lo fanno.
  • Il file di immagine deve essere codificato come immagine progressiva. I file di immagine che non sono stati creati con la codifica progressiva delle immagini non possono implementare la decodifica progressiva, anche se il formato di file lo supporterebbe altrimenti.
  • È necessario che sia disponibile un codec che supporta la decodifica progressiva. Se un codec non supporta la decodifica progressiva, un'immagine codificata come immagine progressiva verrà decodificata come immagine tradizionale.

Supporto della decodifica progressiva in Windows 7

Windows 7 offre codec predefiniti che supportano la decodifica progressiva per i formati di immagine JPEG, PNG e GIF. Ognuno di questi codec di Windows 7 esegue più passaggi di decodifica su un'immagine. Ogni passaggio corrisponde a un particolare livello e a una parte dell'immagine decodificata, portando infine a un'immagine completamente decodificata.

Ogni formato di immagine gestisce la decodifica progressiva in modo diverso. La tabella seguente fornisce informazioni sul numero di livelli progressivi e sul metodo di decodifica supportato dai formati di decodifica progressiva di Windows 7.

Formato immagine Numero di livelli progressivi supportati Metodo di decodifica progressiva
JPEG Definito dall'immagine Aumento della risoluzione
PNG 7 Interlacciamento
GIF 4 Interlacciamento

 

Inoltre, la decodifica progressiva può essere implementata nei codec fornendo il supporto per interfacce e metodi progressivi. Se la decodifica progressiva non è supportata in un codec, i messaggi di errore appropriati devono essere restituiti se questi metodi vengono chiamati.

Decodifica progressiva JPEG

La decodifica progressiva JPEG presenta i dati delle immagini a risoluzioni sempre più elevate per ogni livello, fino a quando non è disponibile l'immagine a risoluzione completa. Ogni livello dell'immagine è impostato per fornire un livello di risoluzione diverso. Man mano che diventano disponibili livelli più progressivi, l'immagine viene visualizzata a risoluzioni più elevate, fino a quando l'immagine a risoluzione completa non viene risolta.

Il numero di livelli disponibili e la risoluzione impostata a ogni livello dipendono interamente dal JPEG codificato. Le due immagini seguenti mostrano un esempio di decodifica progressiva JPEG a due livelli progressivi.

esempi di decodifica progressiva jpeg

L'immagine a sinistra viene decodificata a livello progressivo 0. L'immagine a destra è completamente decodificata dopo cinque livelli progressivi.

Decodifica progressiva PNG/GIF

Sia la decodifica progressiva PNG che GIF usano un metodo di decodifica progressiva interlacciato. Il processo di decodifica per entrambi i formati è molto simile.

Decodifica progressiva PNG

I file di immagine PNG forniscono sette livelli progressivi per la decodifica, come descritto nella specifica PNG. La decodifica progressiva PNG viene implementata decodificando un modello specificato di pixel in ogni passaggio del decodificatore. Il modello nella tabella seguente della specifica PNG viene replicato sull'intera immagine. Ogni numero rappresenta il livello progressivo in cui verrà decodificato il pixel corrispondente.

               
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

 

Dalla tabella precedente è possibile determinare i pixel che verranno decodificati con ogni passaggio del decodificatore. A differenza del codec GIF di Windows 7, il codec PNG di Windows 7 replica il pixel più a sinistra disponibile in una riga di scansione per popolare pixel vuoti.

Le immagini seguenti mostrano un esempio del codec di decodifica progressiva PNG di Windows 7 a tre livelli progressivi.

esempi di decodifica progressiva png

L'immagine in alto a sinistra mostra un'immagine PNG decodificata al livello progressivo 0. L'immagine in alto a destra mostra la stessa immagine PNG decodificata al livello progressivo 3. L'immagine inferiore mostra la stessa immagine completamente decodificata dopo 7 livelli progressivi.

Decodifica progressiva GIF

I file di immagine GIF forniscono quattro livelli progressivi per la decodifica, come descritto nella specifica GIF. Ogni passaggio popola determinate righe all'interno di un'immagine, producendo un'immagine completa dopo il quarto passaggio. La tabella seguente della specifica GIF mostra le linee di scansione decodificate da ciascun passaggio del decodificatore.

Numero di livello / numero di passaggio Linee di scansione popolate Riga di scansione iniziale
1 Ogni ottava riga di scansione 0
2 Ogni ottava linea di scansione 4
3 Ogni quarta riga di scansione 2
4 Ogni seconda riga di scansione 1

 

Anche se i codec possono specificare il contenuto di pixel vuoti in qualsiasi particolare livello, il codec GIF di Windows popola le righe di analisi vuote replicando le righe di analisi popolate sopra la riga di analisi vuota.

Decodifica progressiva nelle applicazioni

L'interfaccia di decodifica progressiva principale è l'interfaccia IWICProgressiveLevelControl. Per ottenere un riferimento all'interfaccia, eseguire una query su un frame di immagine (IWICBitmapFrameDecode) per IWICProgressiveLevelControl. È quindi possibile accedere ai metodi progressivi dall'interfaccia .

Il codice seguente fornisce un esempio per l'uso della decodifica progressiva nelle applicazioni.

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

Il codice precedente fornisce le funzionalità di base necessarie per implementare la decodifica progressiva nella maggior parte delle applicazioni. Usando il codice, è possibile accedere ai livelli progressivi man mano che i dati pixel dell'immagine diventano disponibili. La funzione SetCurrentLevel blocca l'esecuzione fino a quando non è disponibile il livello richiesto.

Supporto codec personalizzato per la decodifica progressiva

Gli sviluppatori di codec possono scegliere di implementare il IWICProgressiveLevelControl se i formati di immagine supportano la decodifica progressiva. Il supporto per la decodifica progressiva non è un requisito per la scoperta e la mediazione da parte di WIC. Tuttavia, la decodifica progressiva migliora notevolmente l'esperienza utente e l'implementazione deve essere considerata, se possibile.

concettuale

Panoramica di Windows Imaging Component

altre risorse

Compressione digitale e codifica delle Continuous-Tone immagini statiche - Requisiti e linee guida

formato di interscambio file JPEG

specifica GIF89a

specifica ed estensioni PNG (Portable Network Graphics)