Win32 API 日本語リファレンス
ホームGraphics.Imaging › IWICProgressiveLevelControl

IWICProgressiveLevelControl

COM
IIDdaac296f-7aa5-4dbf-8d15-225c5976f891継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

プログレッシブデコードに関する情報の取得と制御を行うためのメソッドを公開します。

解説(Remarks)

画像は、プログレッシブエンコードされている場合にのみプログレッシブにデコードできます。プログレッシブ画像は、自動的に最も高い(最高品質の)プログレッシブレベルから開始されます。呼び出し側は、デコーダーをより低いプログレッシブレベルに手動で設定する必要があります。

コーデックがプログレッシブレベルのデコードをサポートしていない場合は、E_NOTIMPL が返されます。

メソッド 3

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT GetLevelCount(DWORD* pcLevels)

コーデックがサポートするプログレッシブデコードのレベル数を取得します。

pcLevelsDWORD*outコーデックがサポートするレベル数を示します。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

プログレッシブ JPEG 画像のプログレッシブレベルを反復処理するために、この関数を使用しないでください。JPEG のプログレッシブレベルは画像によって決定され、固定のレベル数を持ちません。このメソッドを使用すると、アプリケーションは戻る前にすべてのプログレッシブレベルがダウンロードされるまで待機させられます。代わりに、アプリケーションはプログレッシブ JPEG 画像のプログレッシブレベルを反復処理するために、次のコードを使用してください。

Examples

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();
}
vtbl 4 HRESULT GetCurrentLevel(DWORD* pnLevel)

デコーダーの現在のプログレッシブレベルを取得します。

pnLevelDWORD*out現在指定されているレベルを示します。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

レベルは常に最も高いプログレッシブレベルが既定値となります。より低いプログレッシブレベルをデコードするには、まず SetCurrentLevel を呼び出す必要があります。

vtbl 5 HRESULT SetCurrentLevel(DWORD nLevel)

次回の CopyPixels 呼び出しで取得するレベルを指定します。

nLevelDWORDin次に返すレベルを指定します。サポートされているレベルの総数を超えた場合は、エラーが返されます。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

サポートされているすべてのレベルを要求する必要はありません。 呼び出し側がレベル 0 を事前に要求せずにレベル 1 を要求した場合、次回の CopyPixels 呼び出しで返されるビットには両方のレベルが含まれます。

要求されたレベルが無効な場合、返されるエラーは WINCODEC_ERR_INVALIDPROGRESSIVELEVEL です。

Examples

プログレッシブ JPEG 画像のプログレッシブレベルを反復処理するには、GetCurrentLevel メソッドではなくこのメソッドを使用してください。JPEG のプログレッシブレベルは画像によって決定され、固定のレベル数を持ちません。 GetCurrentLevel メソッドを使用すると、アプリケーションは戻る前にすべてのプログレッシブレベルがダウンロードされるまで待機させられます。 代わりに、アプリケーションはプログレッシブ JPEG 画像のプログレッシブレベルを反復処理するために、次のコードを使用してください。

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();
}	
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IWICProgressiveLevelControl "{DAAC296F-7AA5-4DBF-8D15-225C5976F891}"
#usecom global IWICProgressiveLevelControl IID_IWICProgressiveLevelControl "{}"
#comfunc global IWICProgressiveLevelControl_GetLevelCount    3 var
#comfunc global IWICProgressiveLevelControl_GetCurrentLevel  4 var
#comfunc global IWICProgressiveLevelControl_SetCurrentLevel  5 int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。