IWICBitmapSourceTransform の実装

IWICBitmapSourceTransform

省略可能ですが、パフォーマンスの大きな利点が得られる可能性があるため、すべてのデコーダーがこのインターフェイスをフレーム レベルのデコード クラスに実装することを強くお勧めします。 アプリケーションが、イメージ全体を完全な解像度でデコードし、要求された変換を適用するのではなく、特定の関心領域、サイズ、向き、またはピクセル形式を要求すると、Windows イメージング コンポーネント (WIC) は IWICBitmapFrameDecode オブジェクトのこのインターフェイスに対して IUnknown::QueryInterface を呼び出します。 フレーム デコーダーがフレーム デコーダーをサポートしている場合、WIC は適切なメソッドまたはメソッドを呼び出して、フレーム デコーダーが要求された変換を実行できるかどうか、またはデコーダーが要求されたものに提供できる最も近いサイズまたはピクセル形式を決定できるかどうかを判断します。 デコーダーが要求された変換または変換を実行できる場合、WIC は適切なパラメーターを使用して CopyPixels を呼び出します。 デコーダーが要求された変換の一部を実行できるが、すべての変換を実行できない場合、WIC はデコーダーに実行可能な変換を実行するよう要求し、WIC 変換オブジェクト (IWICBitmapScalerIWICBitmapClipperIWICBitmapFlipRotatorIWICFormatConverter) を使用して、 CopyPixels 呼び出しの結果でフレーム デコーダーによって実行できなかった残りの変換を実行します。 デコーダーが IWICBitmapSourceTransform をサポートしていない場合、WIC は変換オブジェクトを使用してすべての変換を実行する必要があります。 通常、デコーダーでは、イメージ全体をデコードしてから変換を実行するよりも、デコード プロセス中に変換を実行する方がはるかに効率的です。 これは特に、はるかに小さいサイズやピクセル形式の変換にスケーリングするなどの操作に当てはまります。

interface IWICBitmapSourceTransform : IUnknown
{
   // Required methods
   HRESULT DoesSupportTransform ( WICTransformOptions dstTransform,
              BOOL *pfIsSupported);
   HRESULT CopyPixels ( WICRect *prcSrc, 
      UINT uiWidth, 
      UINT uiHeight,
      WICPixelFormatGUID * pguidDstFormat,
      WICBitmapTransformOptions dstTransform, 
      UINT nStride, 
      UINT cbBufferSize, 
      BYTE *pbBuffer );

   // Optional methods
   HRESULT GetClosestSize ( UINT *puiWidth,
              UINT *puiHeight);
   HRESULT GetClosestPixelFormat ( WICPixelFormatGUID *pguidDstFormat);
}

DoesSupportTransform

DoesSupportTransform は、デコーダーが要求された回転または反転操作をサポートしているかどうかを確認します。 要求できる WICBitmapTransformOptions は次のとおりです。

enum WICBitmapTransformOptions
{   
   WICBitmapTransformRotate0,
   WICBitmapTransformRotate90,
   WICBitmapTransformRotate180,
   WICBitmapTransformRotate270,
   WICBitmapTransformFlipHorizontal,
   WICBitmapTransformFlipVertical
}

CopyPixels

CopyPixels は、IWICBitmapSource インターフェイスの CopyPixels メソッドなど、イメージ ビットをデコードする実際の処理を実行しますが、IWICBitmapSourceTransformCopyPixels メソッドははるかに強力であり、画像処理のパフォーマンスを大幅に向上させることができます。

複数の変換操作が要求された場合、結果は操作の実行順序に依存します。 コーデック間の予測可能性と一貫性を確保するには、すべてのコーデックが同じ順序でこれらの操作を実行することが重要です。 これは、これらの操作を実行するための正規の順序です。

  1. スケール
  2. Crop
  3. Rotate

ピクセル形式の変換は、他の変換には影響しないため、いつでも実行できます。

最初のパラメーター prcSrc を使用して、イメージをクリッピングする対象領域を指定します。 スケーリングは規則によってクリッピングの前に実行されるため、イメージを拡大または縮小する場合は、イメージのスケーリング後に対象領域を決定する必要があります。

2 番目と 3 番目のパラメーターは、イメージをスケーリングするサイズを示します。

pguidDstFormat パラメーターは、デコードされたイメージに対して要求されたピクセル形式を示します。 WIC は 既に GetClosestPixelFormat を呼び出しているため、デコーダーがサポートしていることを示すピクセル形式にする必要があります。

dstTransform パラメーターは、要求された回転角度と、画像を垂直方向、水平方向、またはその両方に反転するかどうかを示します。 ここでも、WIC は DoesSupportTransform を既に呼び出しているため、要求された変換はデコーダーが既にサポートしていることを示している変換である必要があります。 回転は、常にスケーリングとクリッピングの後に実行する必要があります。

GetClosestSize

GetClosestSize は、2 つの入力/出力パラメーターを受け取ります。 呼び出し元は puiWidth パラメーターと puiHeight パラメーターを使用して、呼び出し元がイメージをデコードするサイズを指定します。 ただし、デコーダーは、DCT サイズの倍数のサイズにのみ画像をデコードでき、異なるイメージ形式で異なる DCT サイズを持つことができます。 デコーダーは、独自の DCT サイズに基づいて、要求されたサイズに最も近いものを決定し、戻り時に puiWidthpuiHeight をこれらのディメンションに設定する必要があります。 より大きなサイズが要求されたが、コーデックがアップスケーリングをサポートしていない場合は、元の を返す必要があります。

GetClosestPixelFormat

GetClosestPixelFormat は、デコーダーがデータを失うことなく提供できる、要求されたピクセル形式に最も近いピクセル形式を決定するために使用されます。 必要に応じて常により制限の厳しい形式に変換できるため、イメージのサイズが大きくなる場合でも、狭いピクセル形式よりも広いピクセル形式に変換することをお勧めします。 ただし、データが失われた後は回復できません。

続きを読む

WIC 対応コーデックを作成する方法の詳細については、「 IWICDevelopRaw の実装」を参照してください。

リファレンス

IWICBitmapSourceTransform

IWICMetadataBlockReader

概念

IWICMetadataBlockReader の実装

IWICDevelopRaw の実装

WIC-Enabled コーデックを記述する方法

Windows Imaging コンポーネントの概要