IWICBitmapSourceTransform
COM公式ドキュメント
特定の操作を、基盤となる IWICBitmapSource の実装に委譲するためのメソッドを公開します。
解説(Remarks)
IWICBitmapSourceTransform インターフェイスは、デコード中にピクセルのスケーリング、反転、回転、または形式変換をネイティブに実行できるコーデックによって実装されます。変換がデコード処理と組み合わされるため、ネイティブな変換は非ネイティブな変換よりも一般的にパフォーマンス上の利点があります。標準搭載の IWICBitmapScaler、IWICBitmapFlipRotator、および IWICFormatConverter の実装は、いずれも対応する IWICBitmapFrameDecode の直後に配置された場合に IWICBitmapSourceTransform インターフェイスを利用します。そのため、一般的なケースではアプリケーションはこのパフォーマンス向上を自動的に受けられ、このインターフェイスを直接使用する必要はありません。ただし、複数の変換を連結する場合や、カスタム変換を実装する場合には、IWICBitmapSourceTransform インターフェイスを直接使用することでパフォーマンス上の利点が得られることがあります。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定された入力パラメーターを使用してピクセルデータをコピーします。
| prc | WICRect* | in | コピーするピクセルの矩形。 |
| uiWidth | DWORD | in | ソースビットマップをスケーリングする幅。このパラメーターは IWICBitmapSourceTransform::GetClosestSize で取得できる値と等しくなければなりません。 |
| uiHeight | DWORD | in | ソースビットマップをスケーリングする高さ。このパラメーターは IWICBitmapSourceTransform::GetClosestSize で取得できる値と等しくなければなりません。 |
| pguidDstFormat | GUID* | in | ピクセルを返す際に希望するピクセル形式の GUID。 この GUID は GetClosestPixelFormat の呼び出しで取得した形式でなければなりません。 |
| dstTransform | WICBitmapTransformOptions | in | ピクセルコピーの前に実行する、希望する回転または反転。 この変換は DoesSupportTransform の呼び出しでサポートされている操作でなければなりません。 dstTransform が指定されている場合、nStride は変換後のストライドであり、元のソースのピクセル形式ではなく pguidDstFormat のピクセル形式に基づきます。 |
| nStride | DWORD | in | 出力先バッファーのストライド。 |
| cbBufferSize | DWORD | in | 出力先バッファーのサイズ。 |
| pbBuffer | BYTE* | out | 出力バッファー。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
コーデック開発者向けの注意事項
prc に NULL を渡した場合、画像全体がコピーされます。このメソッドのコーデック開発者向けの実装の詳細については、Implementing IWICBitmapSourceTransform を参照してください。
複数の変換操作が要求された場合、結果は操作を実行する順序に依存します。 コーデック間で予測可能性と一貫性を確保するため、すべてのコーデックがこれらの操作を同じ順序で実行することが重要です。 推奨される操作の順序は次のとおりです。
- スケーリング
- クロップ
- 反転/回転
ピクセル形式の変換は他の変換に影響を与えないため、任意のタイミングで実行できます。
最初のパラメーター prc は、画像をクリップするための対象領域を指定するために使用します。 慣例として、スケーリングはクリップの前に実行されるため、画像をスケーリングとクリップの両方を行う場合、対象領域は画像がスケーリングされた後で決定する必要があります。
dstTransform が指定されている場合、ストライドは変換後のストライドであり、元のフレームのピクセル形式ではなく CopyPixels の呼び出しで指定された pixelFormat に基づきます。
希望する寸法に対して、実装がネイティブにスケーリングできる最も近い寸法を返します。
| puiWidth | DWORD* | inout | 希望する幅。サポートされる最も近い幅を受け取るポインター。 |
| puiHeight | DWORD* | inout | 希望する高さ。サポートされる最も近い高さを受け取るポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
Windows が提供するコーデックは、ネイティブスケーリングについて次のサポートを提供します。
- BMP、ICO、GIF、TIFF: IWICBitmapSourceTransform の実装なし。
- PNG: スケーリングのサポートなし。
- JPEG: 8、4、または 2 分の 1 へのネイティブなダウンスケーリング。
- JPEG-XR: 元画像を 2 のべき乗でネイティブにスケーリング。
希望する形式が与えられたとき、IWICBitmapSourceTransform の実装がネイティブにピクセルをコピーできる最も近いピクセル形式を取得します。
| pguidDstFormat | GUID* | inout | 希望する形式に最も近いサポート対象のピクセル形式の GUID を受け取るポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
Windows が提供するコーデックは、次のサポートを提供します。
- BMP、ICO、GIF、TIFF: IWICBitmapSourceTransform の実装なし。
- JPEG、PNG、JPEG-XR: 簡易的なサポート(常に IWICBitmapFrameDecode::GetPixelFormat と同じ値を返します)。
特定の変換オプションが IWICBitmapSourceTransform インターフェイスの実装によってネイティブにサポートされているかどうかを判定します。
| dstTransform | WICBitmapTransformOptions | in | サポートされているかどうかを確認する WICBitmapTransformOptions。 |
| pfIsSupported | BOOL* | out | 変換オプションがサポートされているかどうかを示す値を受け取るポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
Windows が提供するコーデックは、次のレベルのサポートを提供します。
- BMP、ICO、GIF、TIFF: IWICBitmapSourceTransform の実装なし。
- JPEG、PNG: 簡易的なサポート(WICBitmapTransformRotate0 のみ)。
- JPEG-XR: すべての変換/回転をサポート。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWICBitmapSourceTransform "{3B16811B-6A43-4EC9-B713-3D5A0C13B940}" #usecom global IWICBitmapSourceTransform IID_IWICBitmapSourceTransform "{}" #comfunc global IWICBitmapSourceTransform_CopyPixels 3 var,int,int,var,int,int,int,var #comfunc global IWICBitmapSourceTransform_GetClosestSize 4 var,var #comfunc global IWICBitmapSourceTransform_GetClosestPixelFormat 5 var #comfunc global IWICBitmapSourceTransform_DoesSupportTransform 6 int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IWICBitmapSourceTransform "{3B16811B-6A43-4EC9-B713-3D5A0C13B940}" #usecom global IWICBitmapSourceTransform IID_IWICBitmapSourceTransform "{}" #comfunc global IWICBitmapSourceTransform_CopyPixels 3 sptr,int,int,sptr,int,int,int,sptr #comfunc global IWICBitmapSourceTransform_GetClosestSize 4 sptr,sptr #comfunc global IWICBitmapSourceTransform_GetClosestPixelFormat 5 sptr #comfunc global IWICBitmapSourceTransform_DoesSupportTransform 6 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。