IWICBitmapScaler
COM公式ドキュメント
リサンプリングまたはフィルタリングのアルゴリズムを使用して、入力ビットマップをリサイズしたものを表します。
解説(Remarks)
画像はより大きいサイズに拡大できます。ただし、高度なスケーリングアルゴリズムを使用したとしても、画像に含まれる情報量には限りがあり、拡大するほどアーティファクトが目立つ傾向があります。
スケーラーは、CopyPixels が呼び出されるたびにリサンプリングアルゴリズムを再適用します。 スケーリング後の画像をアニメーション表示する場合は、スケーリング後の画像を一度だけ作成して新しいビットマップにキャッシュし、その後 IWICBitmapScaler を解放してください。 このようにすると、描画に比べて計算コストが高くなりうるスケーリングアルゴリズムは一度だけ実行され、その結果を何度も表示できます。
スケーラーは、画像を正しくスケーリングするために必要な最小限のメモリを使用するよう最適化されています。 スケーラーは、画像の出力バンドを表すさまざまな矩形を指定して CopyPixels を呼び出すことで、画像の一部を段階的に(バンディングで)生成するために使用できます。 リサンプリングでは通常、ソース画像から重なり合う矩形が必要となるため、ソースビットマップから同じピクセルを複数回要求する場合があります。 一部の画像デコーダーでは、スキャンラインを順序どおりでなく要求すると、パフォーマンスが大きく低下することがあります。 このため、スケーラーは連続する水平なスキャンラインのバンド(矩形の幅がビットマップの幅と等しいもの)を処理するよう最適化されています。 この場合、直前の垂直方向に隣接する矩形のアキュムレーターが再利用され、ソースからのスキャンライン要求の重複を回避します。 これは、スケーラーからのバンド出力を順番に要求すると、パフォーマンスが向上する可能性があることを意味します。 もちろん、スケーラーを単に単一の矩形出力の生成に使用する場合は、スケーラーが内部的にスキャンラインを正しい順序で要求するため、この懸念はなくなります。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定されたパラメーターでビットマップスケーラーを初期化します。
| pISource | IWICBitmapSource* | in | 入力ビットマップソース。 |
| uiWidth | DWORD | in | 出力先の幅。 |
| uiHeight | DWORD | in | 出力先の高さ。 |
| mode | WICBitmapInterpolationMode | in | スケーリング時に使用する WICBitmapInterpolationMode。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
IWICBitmapScaler は複数回初期化できません。たとえば、マルチフレーム画像のすべてのフレームをスケーリングする場合は、フレームごとに新しい IWICBitmapScaler を作成して初期化する必要があります。
Examples
IWICBitmapScaler を使用する例については、How to Scale a Bitmap Source のトピックを参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWICBitmapScaler "{00000302-A8F2-4877-BA0A-FD2B6645FB94}"
#usecom global IWICBitmapScaler IID_IWICBitmapScaler "{}"
#comfunc global IWICBitmapScaler_Initialize 8 sptr,int,int,int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。