IWICPlanarBitmapFrameEncode
COM公式ドキュメント
プレーナー成分の画像ピクセルをエンコーダーに書き込めるようにします。
解説(Remarks)
IWICPlanarBitmapFrameEncode を使用した YCbCr データのエンコードは、IWICBitmapFrameEncode を使用したインターリーブ データのエンコードと似ていますが、同一ではありません。このプレーナー インターフェイスはプレーナー フレーム画像データの書き込み機能のみを公開しており、メタデータやサムネイルの設定、および処理の最後のコミットには引き続きフレーム エンコード インターフェイスを使用してください。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ソース プレーンから複数のラインをエンコード形式に書き込みます。(IWICPlanarBitmapFrameEncode.WritePixels)
| lineCount | DWORD | in | エンコードするライン数。WIC Jpeg 固有のライン数の制限については、「解説」セクションを参照してください。 |
| pPlanes | WICBitmapPlane* | in | エンコードされる各成分プレーンのソース バッファーを指定します。 |
| cPlanes | DWORD | in | pPlanes パラメーターで指定された成分プレーンの数。 |
戻り値
型: HRESULT
プレーンとソース矩形が要件を満たさない場合、このメソッドは WINCODEC_ERR_IMAGESIZEOUTOFRANGE で失敗します。
IWICBitmapSource の形式がエンコーダーの要件を満たさない場合、このメソッドは WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT で失敗します。
解説(Remarks)
連続する WritePixels の呼び出しは、出力画像にスキャンラインを順次追加するものと見なされます。このメソッドの前に IWICBitmapFrameEncode::Initialize、IWICBitmapFrameEncode::SetSize、および IWICBitmapFrameEncode::SetPixelFormat を呼び出す必要があり、そうでない場合は失敗します。
IWICBitmapFrameEncode::SetPixelFormat で設定されたインターリーブ ピクセル形式と、コーデック固有のエンコード パラメーターによって、サポートされるプレーナー形式が決まります。
WIC JPEG エンコーダー: QueryInterface を使用して、WIC JPEG の IWICBitmapFrameEncode 実装からこのインターフェイスを取得できます。このメソッドを使用して WIC JPEG エンコーダーで Y’CbCr データをエンコードする場合、フレーム作成時にエンコーダー オプションでクロマ サブサンプリングを構成できます。詳細については、エンコードの概要および IWICBitmapEncoder::CreateNewFrame を参照してください。
構成されたクロマ サブサンプリングに応じて、lineCount パラメーターには次の制限があります。
| クロマ サブサンプリング | ライン数の制限 | クロマ プレーンの幅 | クロマ プレーンの高さ |
|---|---|---|---|
| 4:2:0 | 呼び出しが画像の最後のスキャンラインを含む場合を除き、2 の倍数 | lumaWidth / 2 を最も近い整数に切り上げた値。 | lumaHeight / 2 を最も近い整数に切り上げた値。 |
| 4:2:2 | 任意 | lumaWidth / 2 を最も近い整数に切り上げた値。 | 任意 |
| 4:4:4 | 任意 | 任意 | 任意 |
| 4:4:0 | 呼び出しが画像の最後のスキャンラインを含む場合を除き、2 の倍数 | 任意 | llumaHeight / 2 を最も近い整数に切り上げた値。 |
スキャンラインの全幅をエンコードする必要があり、ビットマップ ソースの幅はそのプレーナー構成と一致している必要があります。
さらに、IWICBitmapFrameEncode::SetPixelFormat でピクセル形式が設定されている場合、それは GUID_WICPixelFormat24bppBGR でなければなりません。
このメソッドに渡されるビットマップ ソースでサポートされるピクセル形式は次のとおりです。
| プレーン数 | プレーン 1 | プレーン 2 | プレーン 3 |
|---|---|---|---|
| 3 | GUID_WICPixelFormat8bppY | GUID_WICPixelFormat8bppCb | GUID_WICPixelFormat8bppCr |
| 2 | GUID_WICPixelFormat8bppY | GUID_WICPixelFormat16bppCbCr | N/A |
ソース プレーンから複数のラインをエンコード形式に書き込みます。(IWICPlanarBitmapFrameEncode.WriteSource)
| ppPlanes | IWICBitmapSource** | in | 画像プレーンを表す IWICBitmapSource の配列を指定します。 |
| cPlanes | DWORD | in | planes パラメーターで指定された成分プレーンの数。 |
| prcSource | WICRect* | in | IWICBitmapSource プレーンからエンコードするピクセルのソース矩形。Null はソース全体を示します。ソース矩形の幅は SetSize で設定した幅と一致している必要があります。累積されたソース矩形の高さの合計が SetSize で設定した値と同じである限り、WriteSource を繰り返し呼び出すことができます。 |
戻り値
型: HRESULT
プレーンとソース矩形が要件を満たさない場合、このメソッドは WINCODEC_ERR_IMAGESIZEOUTOFRANGE で失敗します。
IWICBitmapSource の形式がエンコーダーの要件を満たさない場合、このメソッドは WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT で失敗します。
解説(Remarks)
連続する WriteSource の呼び出しは、出力画像にスキャンラインを順次追加するものと見なされます。このメソッドの前に IWICBitmapFrameEncode::Initialize、IWICBitmapFrameEncode::SetSize、および IWICBitmapFrameEncode::SetPixelFormat を呼び出す必要があり、そうでない場合は失敗します。
IWICBitmapFrameEncode::SetPixelFormat で設定されたインターリーブ ピクセル形式と、コーデック固有のエンコード パラメーターによって、サポートされるプレーナー形式が決まります。
WIC JPEG エンコーダー: QueryInterface を使用して、WIC JPEG の IWICBitmapFrameEncode 実装からこのインターフェイスを取得できます。このメソッドを使用して WIC JPEG エンコーダーで Y’CbCr データをエンコードする場合、フレーム作成時にエンコーダー オプションでクロマ サブサンプリングを構成できます。詳細については、エンコードの概要および IWICBitmapEncoder::CreateNewFrame を参照してください。
構成されたクロマ サブサンプリングに応じて、lineCount パラメーターには次の制限があります。
| クロマ サブサンプリング | X 座標 | Y 座標 | クロマ幅 | クロマ高さ |
|---|---|---|---|---|
| 4:2:0 | 2 の倍数 | 2 の倍数 | lumaWidth / 2 を最も近い整数に切り上げた値。 | lumaHeight / 2 を最も近い整数に切り上げた値。 |
| 4:2:2 | 2 の倍数 | 任意 | lumaWidth / 2 を最も近い整数に切り上げた値。 | 任意 |
| 4:4:4 | 任意 | 任意 | 任意 | 任意 |
| 4:4:0 | 任意 | 2 の倍数 | lumaWidth | llumaHeight / 2 を最も近い整数に切り上げた値。 |
スキャンラインの全幅をエンコードする必要があり、ビットマップ ソースの幅はそのプレーナー構成と一致している必要があります。
さらに、IWICBitmapFrameEncode::SetPixelFormat でピクセル形式が設定されている場合、それは GUID_WICPixelFormat24bppBGR でなければなりません。
このメソッドに渡されるビットマップ ソースでサポートされるピクセル形式は次のとおりです。
| プレーン数 | プレーン 1 | プレーン 2 | プレーン 3 |
|---|---|---|---|
| 3 | GUID_WICPixelFormat8bppY | GUID_WICPixelFormat8bppCb | GUID_WICPixelFormat8bppCr |
| 2 | GUID_WICPixelFormat8bppY | GUID_WICPixelFormat16bppCbCr | N/A |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWICPlanarBitmapFrameEncode "{F928B7B8-2221-40C1-B72E-7E82F1974D1A}" #usecom global IWICPlanarBitmapFrameEncode IID_IWICPlanarBitmapFrameEncode "{}" #comfunc global IWICPlanarBitmapFrameEncode_WritePixels 3 int,var,int #comfunc global IWICPlanarBitmapFrameEncode_WriteSource 4 sptr,int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWICPlanarBitmapFrameEncode "{F928B7B8-2221-40C1-B72E-7E82F1974D1A}" #usecom global IWICPlanarBitmapFrameEncode IID_IWICPlanarBitmapFrameEncode "{}" #comfunc global IWICPlanarBitmapFrameEncode_WritePixels 3 int,sptr,int #comfunc global IWICPlanarBitmapFrameEncode_WriteSource 4 sptr,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。