IWICProgressiveLevelControl
COM公式ドキュメント
プログレッシブデコードに関する情報の取得と制御を行うためのメソッドを公開します。
解説(Remarks)
画像は、プログレッシブエンコードされている場合にのみプログレッシブにデコードできます。プログレッシブ画像は、自動的に最も高い(最高品質の)プログレッシブレベルから開始されます。呼び出し側は、デコーダーをより低いプログレッシブレベルに手動で設定する必要があります。
コーデックがプログレッシブレベルのデコードをサポートしていない場合は、E_NOTIMPL が返されます。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
コーデックがサポートするプログレッシブデコードのレベル数を取得します。
| pcLevels | DWORD* | 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();
}
デコーダーの現在のプログレッシブレベルを取得します。
| pnLevel | DWORD* | out | 現在指定されているレベルを示します。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
レベルは常に最も高いプログレッシブレベルが既定値となります。より低いプログレッシブレベルをデコードするには、まず SetCurrentLevel を呼び出す必要があります。
次回の CopyPixels 呼び出しで取得するレベルを指定します。
| nLevel | DWORD | in | 次に返すレベルを指定します。サポートされているレベルの総数を超えた場合は、エラーが返されます。 |
戻り値
型: 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 公式リファレンス: 英語 (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 方式にも切替可。#define global IID_IWICProgressiveLevelControl "{DAAC296F-7AA5-4DBF-8D15-225C5976F891}" #usecom global IWICProgressiveLevelControl IID_IWICProgressiveLevelControl "{}" #comfunc global IWICProgressiveLevelControl_GetLevelCount 3 sptr #comfunc global IWICProgressiveLevelControl_GetCurrentLevel 4 sptr #comfunc global IWICProgressiveLevelControl_SetCurrentLevel 5 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。