プログレッシブ デコードの概要

このトピックでは、プログレッシブ デコードと、アプリケーションでプログレッシブ デコードを使用する方法について説明します。 また、プログレッシブ デコードをサポートするコーデックを作成するためのガイドラインも提供します。

このトピックは、次のセクションで構成されています。

はじめに

プログレッシブ デコードを使用すると、イメージ全体のダウンロードが完了する前に、イメージの一部を段階的にデコードおよびレンダリングできます。 この機能により、インターネットから画像を表示するときのユーザーエクスペリエンスが大幅に向上します。デコードを開始する前にイメージ全体がダウンロードされるのを待つ必要がないためです。 ユーザーは、イメージ全体がダウンロードされるずっと前に、使用可能なデータを含むイメージ プレビューを表示できます。 この機能は、インターネットまたは帯域幅が限られたデータ ソースから画像を表示するために使用されるすべてのアプリケーションに不可欠です。

Windows 7 の Windows Imaging Component (WIC) では、JPEG、PNG、GIF などの一般的な画像形式のプログレッシブ デコードがサポートされています。 WIC では、プログレッシブ デコードを実装する WIC 対応の Microsoft 以外のコーデックもサポートされています。 プログレッシブ エンコードは、WIC の現在のリリースではサポートされていません。 このトピックでは、Windows 7 でのプログレッシブ デコードと、アプリケーションでプログレッシブ デコードを有効にする手順について説明します。

プログレッシブ デコードとは

プログレッシブ デコードは、不完全なイメージ ファイルからイメージの一部を増分デコードする機能です。 従来のデコードでは、デコードを開始する前に完全なイメージ ファイルが必要です。 プログレッシブ デコードは、イメージのプログレッシブ レベルのダウンロードが完了した後に開始されます。 デコーダーは、イメージの現在のプログレッシブ レベルでデコード パスを実行します。 その後、各プログレッシブ レベルがダウンロードされると、イメージに対して複数のデコード パスが実行されます。 各デコード パスでは、イメージが完全にダウンロードされてデコードされるまで、より多くのイメージが表示されます。 完全なイメージをデコードするために必要なパスの数は、イメージ ファイル形式と、イメージの作成に使用されるエンコード プロセスによって異なります。

プログレッシブ デコードを実装するには、イメージを特にエンコードする必要がありますが、すべてのイメージ形式でサポートされているわけではありません。 次の一覧は、プログレッシブ デコードを使用するための要件をまとめたものです。

  • イメージ ファイルはプログレッシブ デコードをサポートしている必要があります。 ほとんどの画像形式ではプログレッシブ デコードはサポートされていませんが、一般的な画像形式 JPEG、PNG、GIF はサポートされています。
  • イメージ ファイルは、プログレッシブ イメージとしてエンコードする必要があります。 プログレッシブ イメージ エンコードで作成されなかったイメージ ファイルは、ファイル形式でサポートされている場合でも、プログレッシブ デコードを実装できません。
  • プログレッシブ デコードをサポートするコーデックを使用できる必要があります。 コーデックでプログレッシブ デコードがサポートされていない場合、プログレッシブ イメージとしてエンコードされたイメージは従来のイメージとしてデコードされます。

Windows 7 でのプログレッシブ デコードのサポート

Windows 7 には、JPEG、PNG、GIF 画像形式のプログレッシブ デコードをサポートする組み込みのコーデックが用意されています。 これらの Windows 7 コーデックはそれぞれ、イメージに対して複数のデコード パスを実行します。 各パスは、デコードされるイメージの特定のレベルと部分に対応し、最終的には完全にデコードされたイメージになります。

各イメージ形式では、プログレッシブ デコードが異なる方法で処理されます。 次の表は、プログレッシブ レベルの数と、Windows 7 プログレッシブ デコード形式でサポートされるデコード方法に関する情報を示しています。

イメージ形式 サポートされているプログレッシブ レベルの数 プログレッシブ デコード方法
JPEG イメージで定義 解像度を上げる
PNG 7 インター レース
GIF 4 インター レース

 

さらに、プログレッシブ デコードは、プログレッシブ インターフェイスとメソッドのサポートを提供することで、コーデックに実装できます。 コーデックでプログレッシブ デコードがサポートされていない場合、これらのメソッドが呼び出された場合は、適切なエラー メッセージが返されます。

JPEG プログレッシブ デコード

JPEG プログレッシブ デコードでは、フル解像度の画像が使用可能になるまで、各レベルでますます高い解像度で画像データが表示されます。 イメージの各レベルは、異なる解像度レベルを提供するように設定されます。 プログレッシブ レベルが増えるにつれて、完全な解像度のイメージが解決されるまで、イメージはより高い解像度で表示されます。

使用可能なレベルの数と各レベルで設定される解像度は、エンコードされた JPEG に完全に依存します。 次の 2 つの画像は、2 つのプログレッシブ レベルでの JPEG プログレッシブ デコードの例を示しています。

jpeg プログレッシブ デコードの例

左側の画像はプログレッシブ レベル 0 でデコードされます。 右側の画像は、5 つのプログレッシブ レベルの後に完全にデコードされます。

PNG/GIF プログレッシブ デコード

PNG と GIF の両方のプログレッシブ デコードでは、インターレースされたプログレッシブ デコードメソッドが使用されます。 両方の形式のデコード プロセスは非常に似ています。

PNG プログレッシブ デコード

PNG イメージ ファイルは、PNG 仕様で説明されているように、デコード用に 7 つのプログレッシブ レベルを提供します。 PNG プログレッシブ デコードは、デコーダーの各パスでピクセルの指定されたパターンをデコードすることによって実装されます。 PNG 仕様の次の表のパターンは、イメージ全体にレプリケートされます。 各数値は、対応するピクセルがデコードされるプログレッシブ レベルを表します。

               
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

 

上の表から、デコーダーの各パスでデコードされるピクセルを決定できます。 Windows 7 GIF コーデックとは異なり、Windows 7 PNG コーデックでは、スキャンラインで使用可能な左端のピクセルがレプリケートされ、空のピクセルが設定されます。

次の図は、3 つのプログレッシブ レベルでの Windows 7 PNG プログレッシブ デコード コーデックの例を示しています。

png プログレッシブ デコードの例

左上の画像は、プログレッシブ レベル 0 でデコードされた PNG イメージを示しています。 右上の画像は、プログレッシブ レベル 3 でデコードされた同じ PNG イメージを示しています。 下の画像は、7 つのプログレッシブ レベルの後に完全にデコードされた同じ画像を示しています。

GIF プログレッシブ デコード

GIF イメージ ファイルは、GIF 仕様で説明されているように、デコードに 4 つのプログレッシブ レベルを提供します。 各パスによってイメージ内の特定の行が設定され、4 番目のパスの後に完全なイメージが生成されます。 GIF 仕様の次の表は、デコーダーの各パスによってデコードされるスキャン行を示しています。

レベル番号/合格番号 読み込まれたスキャン行 スキャン行の開始
1 8 番目のスキャン行ごと 0
2 8 番目のスキャン行ごと 4
3 4 番目のスキャン行ごとに 2
4 1 秒ごとのスキャンライン 1

 

コーデックは、特定のレベルで空のピクセルの内容を指定できますが、Windows GIF コーデックは、空のスキャン行の上に設定されたスキャン行をレプリケートすることで、空のスキャン行を設定します。

アプリケーションでのプログレッシブ デコード

メインプログレッシブ デコード インターフェイスは、IWICProgressiveLevelControl インターフェイスです。 インターフェイスへの参照を取得するには、IWICProgressiveLevelControl のイメージ フレーム (IWICBitmapFrameDecode) に対してクエリを実行します。 その後、インターフェイスからプログレッシブ メソッドにアクセスできます。

次のコードでは、アプリケーションでプログレッシブ デコードを使用する例を示します。

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

上記のコードは、ほとんどのアプリケーションでプログレッシブ デコードを実装するために必要な基本的な機能を提供します。 このコードを使用すると、画像ピクセル データが使用可能になったときにプログレッシブ レベルにアクセスできます。 SetCurrentLevel 関数は、要求されているレベルが使用可能になるまで実行をブロックします。

プログレッシブ デコードのカスタム コーデックのサポート

コーデック開発者は、イメージ形式でプログレッシブ デコードがサポートされている場合、 IWICProgressiveLevelControl を実装することを選択できます。 プログレッシブ デコードのサポートは、WIC による検出と調停の要件ではありません。 ただし、プログレッシブ デコードによってユーザー エクスペリエンスが大幅に向上し、可能であれば実装を検討する必要があります。

概念

Windows イメージング コンポーネントの概要

その他のリソース

Continuous-Tone静止画像のデジタル圧縮とコーディング - 要件とガイドライン

JPEG ファイル交換形式

GIF89a 仕様

ポータブル ネットワーク グラフィックス (PNG) の仕様と拡張機能