Condividi tramite


Panoramica della decodifica progressiva

Questo argomento introduce 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.

In questo argomento sono contenute le sezioni seguenti.

Introduzione

La decodifica progressiva offre la possibilità di decodificare e eseguire il rendering incrementale di parti di un'immagine prima che l'intera immagine abbia completato il download. Questa funzionalità migliora notevolmente l'esperienza dell'utente durante la visualizzazione di immagini da Internet, perché l'utente non deve attendere che l'intera immagine venga scaricata prima che la decodifica possa iniziare. Gli utenti possono visualizzare un'anteprima dell'immagine con dati disponibili molto tempo prima che l'intera immagine venga scaricata. 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 i codec non Microsoft abilitati per WIC che implementano la decodifica progressiva. La codifica progressiva non è supportata nella versione corrente di WIC. Questo argomento descrive la decodifica progressiva in Windows 7 e la procedura per abilitare la decodifica progressiva nelle applicazioni.

Che cos'è la decodifica progressiva?

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 aver completato il download di un'immagine a livello progressivo. Il decodificatore esegue un passaggio di decodifica sul livello progressivo corrente dell'immagine. Esegue quindi più passaggi di decodifica dell'immagine quando ogni livello progressivo viene scaricato. 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 popolari non supportano la decodifica progressiva.
  • Il file di immagine deve essere codificato come immagine progressiva. I file di immagine che non sono stati creati con la codifica dell'immagine progressiva non possono implementare la decodifica progressiva, anche se il formato di file sarebbe altrimenti supportato.
  • Un codec che supporta la decodifica progressiva deve essere disponibile. Se un codec non supporta la decodifica progressiva, un'immagine codificata come immagine progressiva verrà decodificata come immagine tradizionale.

Supporto di 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 Windows 7 esegue più passaggi di decodifica su un'immagine. Ogni passaggio corrisponde a un determinato livello e 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 in codec fornendo 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 in risoluzioni superiori, fino a quando l'immagine di risoluzione completa non viene risolta.

Il numero di livelli disponibili e la risoluzione impostata a ogni livello dipende 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

La decodifica progressiva PNG e 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 dalla 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ù disponibile a sinistra in una riga di analisi 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 a livello progressivo 0. L'immagine in alto a destra mostra la stessa immagine PNG decodificata a 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, generando un'immagine completa dopo il quarto passaggio. La tabella seguente della specifica GIF mostra quali righe di analisi vengono decodificate da ogni passaggio del decodificatore.

Numero di livello/numero di passaggio Analizzare le righe popolate Riga di analisi iniziale
1 Ogni ottava riga di analisi 0
2 Ogni ottava riga di analisi 4
3 Ogni quarta riga di analisi 2
4 Ogni seconda riga di analisi 1

 

Anche se i codec possono specificare il contenuto di pixel vuoti a qualsiasi livello specifico, 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. I metodi progressivi possono quindi essere accessibili 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 la funzionalità di base necessaria per implementare la decodifica progressiva nella maggior parte delle applicazioni. Usando il codice, i livelli progressivi possono essere accessibili quando i dati dei pixel dell'immagine diventano disponibili. La funzione SetCurrentLevel blocca l'esecuzione fino a quando non è disponibile il livello richiesto.

Supporto del codec personalizzato per la decodifica progressiva

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

Informazioni concettuali

Panoramica del componente Di creazione immagini di Windows

Altre risorse

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

Formato di interscambio file JPEG

Specifica GIF89a

Specifica e estensioni della rete portabile (PNG)