Übersicht über die progressive Decodierung

In diesem Thema werden die progressive Decodierung und die Verwendung der progressiven Decodierung in Anwendungen vorgestellt. Außerdem werden Richtlinien zum Erstellen von Codecs bereitgestellt, die die progressive Decodierung unterstützen.

Dieses Thema enthält folgende Abschnitte:

Einführung

Die progressive Decodierung bietet die Möglichkeit, Teile eines Bilds inkrementell zu decodieren und zu rendern, bevor das gesamte Bild heruntergeladen wurde. Dieses Feature verbessert die Benutzerfreundlichkeit beim Anzeigen von Bildern aus dem Internet erheblich, da der Benutzer nicht warten muss, bis das gesamte Bild heruntergeladen wird, bevor die Decodierung beginnen kann. Benutzer können eine Bildvorschau mit verfügbaren Daten sehen, lange bevor das gesamte Image heruntergeladen wird. Dieses Feature ist für alle Anwendungen unerlässlich, die zum Anzeigen von Bildern aus dem Internet oder aus Datenquellen mit begrenzter Bandbreite verwendet werden.

Die Windows Imaging Component (WIC) in Windows 7 unterstützt die progressive Decodierung gängiger Bildformate wie JPEG, PNG und GIF. WIC unterstützt auch alle WIC-fähigen Nicht-Microsoft-Codecs, die progressive Decodierung implementieren. Die progressive Codierung wird in der aktuellen Version von WIC nicht unterstützt. In diesem Thema werden die progressive Decodierung in Windows 7 und das Verfahren zum Aktivieren der progressiven Decodierung in Ihren Anwendungen beschrieben.

Was ist progressive Decodierung?

Progressive Decodierung ist die Möglichkeit, Teile eines Bilds aus einer unvollständigen Bilddatei inkrementell zu decodieren. Die herkömmliche Decodierung erfordert eine vollständige Bilddatei, bevor die Decodierung beginnen kann. Die progressive Decodierung beginnt, nachdem der Download einer progressiven Ebene eines Bilds abgeschlossen ist. Der Decoder führt einen Decodierungsdurchlauf auf der aktuellen progressiven Ebene des Bilds durch. Anschließend werden mehrere Decodierungsvorgänge für das Bild ausgeführt, während jede progressive Ebene heruntergeladen wird. Jeder Decodierungsdurchlauf zeigt mehr des Bilds an, bis das Bild vollständig heruntergeladen und decodiert ist. Die Anzahl von Durchläufen, die zum Decodieren eines vollständigen Bilds erforderlich sind, hängt vom Format der Bilddatei und dem Codierungsprozess ab, der zum Erstellen des Images verwendet wird.

Bilder müssen speziell codiert sein, um progressive Decodierung zu implementieren, aber nicht alle Bildformate unterstützen dies. In der folgenden Liste sind die Anforderungen für die verwendung der progressiven Decodierung zusammengefasst.

  • Die Imagedatei muss die progressive Decodierung unterstützen. Die meisten Bildformate unterstützen keine progressive Decodierung, obwohl die gängigen Bildformate JPEG, PNG und GIF dies tun.
  • Die Bilddatei muss als progressives Bild codiert werden. Bilddateien, die nicht mit der progressiven Bildcodierung erstellt wurden, können keine progressive Decodierung implementieren, auch wenn das Dateiformat sie andernfalls unterstützen würde.
  • Ein Codec, der die progressive Decodierung unterstützt, muss verfügbar sein. Wenn ein Codec die progressive Decodierung nicht unterstützt, wird ein als progressives Bild codiertes Bild als herkömmliches Bild decodiert.

Unterstützung für progressive Decodierung in Windows 7

Windows 7 bietet integrierte Codecs, die die progressive Decodierung für JPEG-, PNG- und GIF-Bildformate unterstützen. Jeder dieser Windows 7-Codecs führt mehrere Decodierungsdurchläufe für ein Bild aus. Jeder Durchlauf entspricht einer bestimmten Ebene und einem bestimmten Teil des Bilds, der decodiert wird, was schließlich zu einem vollständig decodierten Bild führt.

Jedes Bildformat verarbeitet die progressive Decodierung auf unterschiedliche Weise. Die folgende Tabelle enthält Informationen zur Anzahl progressiver Ebenen und zur Decodierungsmethode, die von den progressiven Windows 7-Decodierungsformaten unterstützt wird.

Bildformat Anzahl der unterstützten progressiven Ebenen Progressive Decodierungsmethode
JPEG Durch Image definiert Auflösung erhöhen
PNG 7 Interlacing
GIF 4 Interlacing

 

Darüber hinaus kann die progressive Decodierung in Codecs implementiert werden, indem unterstützung für progressive Schnittstellen und Methoden bereitgestellt wird. Wenn die progressive Decodierung in einem Codec nicht unterstützt wird, sollten entsprechende Fehlermeldungen zurückgegeben werden, wenn diese Methoden aufgerufen werden.

JPEG Progressive Decodierung

Die progressive JPEG-Decodierung stellt Bilddaten mit immer höherer Auflösung für jede Ebene dar, bis das Bild mit voller Auflösung verfügbar ist. Jede Ebene des Bildes ist so festgelegt, dass eine andere Auflösungsebene bereitgestellt wird. Wenn progressivere Ebenen verfügbar werden, wird das Bild mit höheren Auflösungen angezeigt, bis das Bild mit voller Auflösung aufgelöst wird.

Die Anzahl der verfügbaren Ebenen und die auf jeder Ebene festgelegte Auflösung hängen vollständig vom codierten JPEG ab. Die folgenden beiden Bilder zeigen ein Beispiel für die progressive JPEG-Decodierung auf zwei progressiven Ebenen.

Beispiele für die progressive JPEG-Decodierung

Das Bild auf der linken Seite wird mit progressiver Ebene 0 decodiert. Das Bild auf der rechten Seite ist nach fünf progressiven Ebenen vollständig decodiert.

PNG/GIF Progressive Decodierung

Sowohl die progressive PNG- als auch die GIF-Decodierung verwenden eine interlaced progressive Decodierungsmethode. Der Decodierungsprozess für beide Formate ist sehr ähnlich.

PNG Progressive Decodierung

PNG-Bilddateien bieten sieben progressive Ebenen für die Decodierung, wie in der PNG-Spezifikation beschrieben. Die progressive PNG-Decodierung wird implementiert, indem ein angegebenes Pixelmuster auf jedem Durchlauf des Decoders decodiert wird. Das Muster in der folgenden Tabelle aus der PNG-Spezifikation wird über das gesamte Bild repliziert. Jede Zahl stellt die progressive Ebene dar, in der das entsprechende Pixel decodiert wird.

               
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

 

In der obigen Tabelle können Sie die Pixel bestimmen, die mit jedem Durchlauf des Decoders decodiert werden. Im Gegensatz zum Windows 7 GIF-Codec repliziert der Windows 7-PNG-Codec das linksste verfügbare Pixel in einer Scanzeile, um leere Pixel aufzufüllen.

Die folgenden Bilder zeigen ein Beispiel für den progressiven Windows 7 PNG-Decodierungscodec auf drei progressiven Ebenen.

Beispiele für die progressive Png-Decodierung

Das Bild oben links zeigt ein PNG-Bild, das mit progressiver Ebene 0 decodiert ist. Das Bild oben rechts zeigt dasselbe PNG-Bild, das auf progressiver Ebene 3 decodiert ist. Das untere Bild zeigt dasselbe Bild, das nach 7 progressiven Ebenen vollständig decodiert wurde.

GIF Progressive Decodierung

GIF-Bilddateien bieten vier progressive Ebenen für die Decodierung, wie in der GIF-Spezifikation beschrieben. Jeder Durchlauf füllt bestimmte Zeilen innerhalb eines Bilds auf und erzeugt nach dem vierten Durchlauf ein vollständiges Bild. Die folgende Tabelle aus der GIF-Spezifikation zeigt, welche Scanlinien von jedem Durchlauf des Decoders decodiert werden.

Levelnummer/Passnummer Aufgefüllte Scanzeilen Starten der Scanzeile
1 Jede achte Scanzeile 0
2 Jede achte Scanzeile 4
3 Jede vierte Scanzeile 2
4 Jede zweite Scanzeile 1

 

Codecs können zwar den Inhalt leerer Pixel auf einer bestimmten Ebene angeben, aber der Windows GIF-Codec füllt leere Scanzeilen auf, indem aufgefüllte Scanzeilen über der leeren Scanzeile repliziert werden.

Progressive Decodierung in Anwendungen

Die Standard Schnittstelle für die progressive Decodierung ist die IWICProgressiveLevelControl-Schnittstelle. Um einen Verweis auf die Schnittstelle abzurufen, fragen Sie einen Bildrahmen (IWICBitmapFrameDecode) für IWICProgressiveLevelControl ab. Auf progressive Methoden kann dann über die Schnittstelle zugegriffen werden.

Der folgende Code enthält ein Beispiel für die Verwendung der progressiven Decodierung in Anwendungen.

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

Der vorherige Code stellt die grundlegende Funktionalität bereit, die für die Implementierung der progressiven Decodierung in den meisten Anwendungen erforderlich ist. Mithilfe des Codes kann auf progressive Ebenen zugegriffen werden, sobald Bildpixeldaten verfügbar werden. Die SetCurrentLevel-Funktion blockiert die Ausführung, bis die angeforderte Ebene verfügbar ist.

Unterstützung für benutzerdefinierte Codecs für die progressive Decodierung

Codecentwickler können das IWICProgressiveLevelControl implementieren, wenn ihre Bildformate progressive Decodierung unterstützen. Die Unterstützung für die progressive Decodierung ist keine Anforderung für die Ermittlung und Schlichtung durch WIC. Die progressive Decodierung verbessert jedoch die Benutzerfreundlichkeit erheblich, und die Implementierung sollte nach Möglichkeit in Betracht gezogen werden.

Konzept

Übersicht über die Windows-Bildverarbeitungskomponente

Andere Ressourcen

Digitale Komprimierung und Codierung von Continuous-Tone Standbildern – Anforderungen und Richtlinien

JPEG-Dateiaustauschformat

GIF89a-Spezifikation

Portable Network Graphics (PNG) – Spezifikation und Erweiterungen