Udostępnij za pośrednictwem


Dekodowanie progresywne — omówienie

W tym temacie przedstawiono progresywne dekodowanie i sposób używania progresywnego dekodowania w aplikacjach. Zawiera również wskazówki dotyczące tworzenia koderów obsługujących dekodowanie progresywne.

Ten temat zawiera następujące sekcje.

Wprowadzenie

Dekodowanie progresywne umożliwia przyrostowe dekodowanie i renderowanie fragmentów obrazu przed zakończeniem pobierania całego obrazu. Ta funkcja znacznie poprawia środowisko użytkownika podczas wyświetlania obrazów z Internetu, ponieważ użytkownik nie musi czekać na cały obraz do pobrania przed rozpoczęciem dekodowania. Użytkownicy mogą zobaczyć podgląd obrazu z dostępnymi danymi na długo przed pobraniem całego obrazu. Ta funkcja jest niezbędna dla każdej aplikacji używanej do wyświetlania obrazów z Internetu lub ze źródeł danych z ograniczoną przepustowością.

Składnik Windows Imaging (WIC) w systemie Windows 7 obsługuje progresywne dekodowanie popularnych formatów obrazów, takich jak JPEG, PNG i GIF. WIC obsługuje również dowolne kodeki inne niż Microsoft z obsługą WIC, które implementują progresywne dekodowanie. Kodowanie progresywne nie jest obsługiwane w bieżącej wersji usługi WIC. W tym temacie opisano progresywne dekodowanie w systemie Windows 7 i procedurę włączania progresywnego dekodowania w aplikacjach.

Co to jest dekodowanie progresywne?

Dekodowanie progresywne to możliwość przyrostowego dekodowania fragmentów obrazu z niekompletnego pliku obrazu. Tradycyjne dekodowanie wymaga kompletnego pliku obrazu przed rozpoczęciem dekodowania. Dekodowanie progresywne rozpoczyna się po zakończeniu pobierania kolejnego poziomu progresywnego obrazu. Dekoder wykonuje przejście dekodujące na aktualnym progresywnym poziomie obrazu. Następnie wykonuje wiele przechodów dekodowania obrazu w miarę pobierania każdego kolejnego poziomu. Każdy kolejny przebieg dekodujący ujawnia więcej obrazka, aż zostanie on w pełni pobrany i zdekodowany. Liczba przebiegów wymaganych do dekodowania pełnego obrazu zależy od formatu pliku obrazu i procesu kodowania użytego do utworzenia obrazu.

Obrazy muszą być specjalnie zakodowane w celu zaimplementowania progresywnego dekodowania, ale nie wszystkie formaty obrazów obsługują je. Poniższa lista zawiera podsumowanie wymagań dotyczących używania dekodowania progresywnego.

  • Plik obrazu musi obsługiwać dekodowanie progresywne. Większość formatów obrazów nie obsługuje dekodowania progresywnego, z wyjątkiem popularnych formatów, takich jak JPEG, PNG i GIF.
  • Plik obrazu musi być zakodowany jako obraz progresywny. Pliki obrazów, które nie zostały utworzone z kodowaniem progresywnym obrazu, nie mogą implementować dekodowania progresywnego, nawet jeśli format pliku w przeciwnym razie będzie go obsługiwać.
  • Koder kodujący obsługujący dekodowanie progresywne musi być dostępny. Jeśli koder koderowy nie obsługuje dekodowania progresywnego, obraz zakodowany jako progresywny obraz zostanie zdekodowany jako tradycyjny obraz.

Progresywna obsługa dekodowania w systemie Windows 7

System Windows 7 udostępnia wbudowane koderacje obsługujące progresywne dekodowanie dla formatów obrazów JPEG, PNG i GIF. Każdy z tych kodeków systemu Windows 7 wykonuje wiele kroków dekodowania obrazu. Każde przejście odpowiada określonemu poziomowi i części obrazu, która została zdekodowana, ostatecznie prowadząc do całkowicie zdekodowanego obrazu.

Każdy format obrazu obsługuje dekodowanie progresywne w inny sposób. Poniższa tabela zawiera informacje o liczbie poziomów progresywnych i metod dekodowania obsługiwanych przez progresywne formaty dekodowania systemu Windows 7.

Format obrazu Liczba obsługiwanych poziomów progresywnych Metoda dekodowania progresywnego
JPEG Zdefiniowane przez obraz Zwiększanie rozdzielczości
PNG 7 Przeplot
GIF 4 Przeplot

 

Ponadto dekodowanie progresywne można zaimplementować w koderach, zapewniając obsługę progresywnych interfejsów i metod. Jeśli dekodowanie progresywne nie jest obsługiwane w kodeku, należy zwrócić odpowiednie komunikaty o błędach, gdy te metody są wywoływane.

Dekodowanie progresywne JPEG

Dekodowanie progresywne JPEG przedstawia dane obrazów w coraz wyższych rozdzielczościach dla każdego poziomu, dopóki obraz w pełnej rozdzielczości nie będzie dostępny. Każdy poziom obrazu jest ustawiony w celu zapewnienia innego poziomu rozdzielczości. W miarę jak dostępne stają się bardziej progresywne poziomy, obraz jest wyświetlany przy wyższych rozdzielczościach, aż do uzyskania obrazu w pełnej rozdzielczości.

Liczba dostępnych poziomów i rozdzielczość ustawiona na każdym poziomie zależy całkowicie od zakodowanego pliku JPEG. Na poniższych dwóch obrazach przedstawiono przykład dekodowania progresywnego JPEG na dwóch poziomach progresywnych.

przykłady progresywnego dekodowania jpeg

Obraz po lewej stronie jest zdekodowany na poziomie progresywnym 0. Obraz po prawej stronie jest w pełni zdekodowany po pięciu poziomach progresywnych.

Dekodowanie progresywne PNG/GIF

Zarówno progresywne dekodowanie PNG, jak i GIF używają metody dekodowania progresywnego z przeplotem. Proces dekodowania obu formatów jest bardzo podobny.

Dekodowanie progresywne PNG

Pliki obrazów PNG zapewniają siedem poziomów progresywnych dekodowania, zgodnie ze specyfikacją PNG. Dekodowanie progresywne PNG jest implementowane przez dekodowanie określonego wzorca pikseli na każdym przekazaniu dekodera. Wzorzec w poniższej tabeli ze specyfikacji PNG jest replikowany na całym obrazie. Każda liczba reprezentuje poziom progresywny, w którym odpowiedni piksel zostanie zdekodowany.

               
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

 

W powyższej tabeli można określić piksele, które będą dekodowane przy każdym przekazaniu dekodera. W przeciwieństwie do kodera GIF systemu Windows 7, koder PNG systemu Windows 7 replikuje najbardziej skrajny lewy dostępny piksel w wierszu skanowania, aby uzupełnić puste piksele.

Na poniższych obrazach pokazano przykład kodeka progresywnego dekodowania PNG w systemie Windows 7 w trzech stopniach progresywnych.

przykłady progresywnego dekodowania png

Obraz w lewym górnym rogu przedstawia obraz PNG zdekodowany na poziomie progresywnym 0. Obraz w prawym górnym rogu przedstawia ten sam obraz PNG zdekodowany na poziomie progresywnym 3. Dolny obraz przedstawia ten sam obraz w pełni zdekodowany po 7 poziomach progresywnych.

Dekodowanie progresywne GIF

Pliki obrazów GIF zapewniają cztery poziomy progresywne dekodowania, zgodnie ze specyfikacją GIF. Każdy przebieg wypełnia niektóre linie obrazu, tworząc pełny obraz po czwartym przebiegu. Poniższa tabela ze specyfikacji GIF pokazuje, które wiersze skanowania są dekodowane przez każdy przepustek dekodera.

Numer poziomu/numer dostępu Zapełnione linie skanowania Uruchamianie wiersza skanowania
1 Co ósmy wiersz skanowania 0
2 Co ósmy wiersz skanowania 4
3 Co czwarty wiersz skanowania 2
4 Co drugi wiersz skanowania 1

 

Mimo że koderzyści mogą określać zawartość pustych pikseli na dowolnym poziomie, koder gif systemu Windows wypełnia puste wiersze skanowania przez replikowanie wypełnionych wierszy skanowania powyżej pustego wiersza skanowania.

Dekodowanie progresywne w aplikacjach

Głównym progresywnym interfejsem dekodowania jest interfejs IWICProgressiveLevelControl. Aby uzyskać odwołanie do interfejsu, wykonaj zapytanie dotyczące ramki obrazu (IWICBitmapFrameDecode) dla IWICProgressiveLevelControl. Następnie można uzyskać dostęp do metod progresywnych z poziomu interfejsu.

Poniższy kod zawiera przykład użycia dekodowania progresywnego w aplikacjach.

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

Powyższy kod zapewnia podstawowe funkcje niezbędne do implementowania dekodowania progresywnego w większości aplikacji. Za pomocą kodu dostęp do poziomów progresywnych można uzyskać, gdy dane pikseli obrazu staną się dostępne. Funkcja SetCurrentLevel blokuje wykonywanie do momentu udostępnienia żądanego poziomu.

Obsługa kodera niestandardowego na potrzeby dekodowania progresywnego

Deweloperzy kodu mogą zdecydować się na zaimplementowanie IWICProgressiveLevelControl, jeśli ich formaty obrazów obsługują dekodowanie progresywne. Obsługa progresywnego dekodowania nie jest wymagana dla odnajdywania i arbitrażu przez WIC. Jednak dekodowanie progresywne znacznie zwiększa środowisko użytkownika, a implementacja powinna być brana pod uwagę, jeśli to możliwe.

Pojęciowe

Składnik programu Windows Imaging — omówienie

Inne zasoby

Cyfrowa kompresja i kodowanie nieruchomych obrazów Continuous-Tone - wymagania i wytyczne

Format wymiany plików JPEG

specyfikacji GIF89a

Specyfikacja i rozszerzenia przenośnej grafiki sieciowej (PNG)