IWICJpegFrameDecode
COM公式ドキュメント
JPEG 画像をデコードするためのメソッドを公開します。Start Of Frame (SOF) ヘッダー、Start Of Scan (SOS) ヘッダー、Huffman テーブルおよび量子化テーブル、圧縮された JPEG データへのアクセスを提供します。さらに、効率的なランダムアクセスのためのインデックス作成を可能にします。
解説(Remarks)
このインターフェイスは、JPEG デコーダー用に Windows が提供する IWICBitmapFrameDecoder インターフェイスに対して IUnknown::QueryInterface を呼び出すことで取得します。
メソッド 10
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
このデコーダーが効率的なランダムアクセスのためのインデックス作成をサポートしているかどうかを示す値を取得します。
| pfIndexingSupported | BOOL* | out | インデックス作成がサポートされている場合は true、それ以外の場合は false です。 |
戻り値
解説(Remarks)
インデックス作成は一部の JPEG 形式でのみサポートされています。このメソッドを呼び出してください。
効率的なランダムアクセスのために JPEG のインデックス作成を有効にします。
| options | WICJpegIndexingOptions | in | インデックスを直ちに生成するか、以降の IWICBitmapSource::CopyPixels の呼び出しまで遅延するかを指定する値です。 |
| horizontalIntervalSize | DWORD | in | インデックス作成の粒度(ピクセル単位)です。 |
戻り値
解説(Remarks)
このメソッドは、メモリ使用量と引き換えに、画像ピクセルへの効率的なランダムアクセスを可能にします。インデックス作成に必要なメモリ量は、要求されたインデックスの粒度によって異なります。SetIndexing を呼び出さない限り、IWICBitmapSource::CopyPixels の呼び出し時にピクセルを上から下へ順に処理して JPEG にアクセスする方がはるかに効率的です。
このメソッドは、ファイルがインデックス作成をサポートしていない場合には失敗します。まず IWICJpegFrameDecode::DoesSupportIndexing を呼び出して、インデックス作成がサポートされているかどうかを判断してください。このメソッドが複数回呼び出された場合、最後の呼び出しがインデックスの粒度を要求されたサイズに変更します。
指定されたインターバルサイズは、インデックスエントリの水平方向の間隔を制御します。この値は、JPEG の MCU (minimum coded unit) サイズ(通常はスケーリング前で 8 または 16 ピクセル)に従って内部的に切り上げられます。インデックスインターバルの垂直方向のサイズは、常に 1 MCU サイズに等しくなります。
インデックスは直ちに生成することも、冗長な解凍処理を減らすために以降の IWICBitmapSource::CopyPixels の呼び出し時に生成することもできます。
IWICJpegFrameDecode::SetIndexing を使用してインデックス作成された JPEG からインデックスを削除します。
戻り値
指定されたスキャンおよびテーブルの AC Huffman テーブルのコピーを取得します。(IWICJpegFrameDecode.GetAcHuffmanTable)
| scanIndex | DWORD | in | データを取得するスキャンの 0 から始まるインデックスです。 |
| tableIndex | DWORD | in | 取得する AC Huffman テーブルのインデックスです。指定したスキャンで有効なインデックスは、IWICJpegFrameDecode::GetScanHeader でスキャンヘッダーを取得することで判断できます。 |
| pAcHuffmanTable | DXGI_JPEG_AC_HUFFMAN_TABLE* | out | テーブルデータを受け取るポインターです。このパラメーターは NULL であってはなりません。 |
戻り値
型: HRESULT
このメソッドは、次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| 操作は成功しました。 | |
| 指定されたスキャンインデックスが無効です。 | |
| pAcHuffmanTable が NULL の場合、または tableIndex が有効なテーブルスロットを指していない場合に発生することがあります。有効なテーブルインデックスについてはスキャンヘッダーを確認してください。 |
指定されたスキャンおよびテーブルの DC Huffman テーブルのコピーを取得します。(IWICJpegFrameDecode.GetDcHuffmanTable)
| scanIndex | DWORD | in | データを取得するスキャンの 0 から始まるインデックスです。 |
| tableIndex | DWORD | in | 取得する DC Huffman テーブルのインデックスです。指定したスキャンで有効なインデックスは、IWICJpegFrameDecode::GetScanHeader でスキャンヘッダーを取得することで判断できます。 |
| pDcHuffmanTable | DXGI_JPEG_DC_HUFFMAN_TABLE* | out | テーブルデータを受け取るポインターです。このパラメーターは NULL であってはなりません。 |
戻り値
型: HRESULT
このメソッドは、次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| 操作は成功しました。 | |
| 指定されたスキャンインデックスが無効です。 | |
| pTable が NULL の場合、または tableIndex が有効なテーブルスロットを指していない場合に発生することがあります。有効なテーブルインデックスについてはスキャンヘッダーを確認してください。 |
量子化テーブルのコピーを取得します。(IWICJpegFrameDecode.GetQuantizationTable)
| scanIndex | DWORD | in | データを取得するスキャンの 0 から始まるインデックスです。 |
| tableIndex | DWORD | in | 取得する量子化テーブルのインデックスです。指定したスキャンで有効なインデックスは、IWICJpegFrameDecode::GetScanHeader でスキャンヘッダーを取得することで判断できます。 |
| pQuantizationTable | DXGI_JPEG_QUANTIZATION_TABLE* | out | テーブルデータを受け取るポインターです。このパラメーターは NULL であってはなりません。 |
戻り値
型: HRESULT
このメソッドは、次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| 操作は成功しました。 | |
| 指定されたスキャンインデックスが無効です。 | |
| pTable が NULL の場合、または tableIndex が有効なテーブルスロットを指していない場合に発生することがあります。有効なテーブルインデックスについてはスキャンヘッダーを確認してください。 |
フレーム全体からヘッダーデータを取得します。
| pFrameHeader | WICJpegFrameHeader* | out | フレームヘッダーデータを受け取るポインターです。 |
戻り値
指定されたインデックスのスキャンについて、Start Of Scan (SOS) マーカーからパラメーターを取得します。
| scanIndex | DWORD | in | ヘッダーデータを取得するスキャンのインデックスです。 |
| pScanHeader | WICJpegScanHeader* | out | フレームヘッダーデータを受け取るポインターです。 |
戻り値
WIC デコーダーフレームの出力ストリームから、圧縮された JPEG スキャンのコピーを直接取得します。
| scanIndex | DWORD | in | データを取得するスキャンの 0 から始まるインデックスです。 |
| scanOffset | DWORD | in | コピーを開始するスキャンデータ内のバイト位置です。最初の呼び出しでは 0 を使用してください。出力バッファのサイズがスキャン全体を格納するのに不十分な場合、このオフセットを使用して前回のコピー操作の終了位置からコピーを再開できます。 |
| cbScanData | DWORD | in | pbScanData 配列のサイズ(バイト単位)です。 |
| pbScanData | BYTE* | out | テーブルデータを受け取るポインターです。このパラメーターは NULL であってはなりません。 |
| pcbScanDataActual | DWORD* | out | pbScanData に実際にコピーされたスキャンデータのサイズを受け取るポインターです。返されるサイズは cbScanData のサイズより小さい場合があります。このパラメーターは NULL でもかまいません。 |
戻り値
| streamOffset | DWORD | in | 最小ストリーム内のコピー開始バイトオフセット。 |
| cbStreamData | DWORD | in | pbStreamDataバッファーのバイトサイズ。容量を示す。 |
| pbStreamData | BYTE* | out | 最小JPEGストリームデータを受け取る出力先バッファー。 |
| pcbStreamDataActual | DWORD* | out | 実際にコピーされたバイト数を受け取る出力先。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWICJpegFrameDecode "{8939F66E-C46A-4C21-A9D1-98B327CE1679}" #usecom global IWICJpegFrameDecode IID_IWICJpegFrameDecode "{}" #comfunc global IWICJpegFrameDecode_DoesSupportIndexing 3 var #comfunc global IWICJpegFrameDecode_SetIndexing 4 int,int #comfunc global IWICJpegFrameDecode_ClearIndexing 5 #comfunc global IWICJpegFrameDecode_GetAcHuffmanTable 6 int,int,var #comfunc global IWICJpegFrameDecode_GetDcHuffmanTable 7 int,int,var #comfunc global IWICJpegFrameDecode_GetQuantizationTable 8 int,int,var #comfunc global IWICJpegFrameDecode_GetFrameHeader 9 var #comfunc global IWICJpegFrameDecode_GetScanHeader 10 int,var #comfunc global IWICJpegFrameDecode_CopyScan 11 int,int,int,var,var #comfunc global IWICJpegFrameDecode_CopyMinimalStream 12 int,int,var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IWICJpegFrameDecode "{8939F66E-C46A-4C21-A9D1-98B327CE1679}" #usecom global IWICJpegFrameDecode IID_IWICJpegFrameDecode "{}" #comfunc global IWICJpegFrameDecode_DoesSupportIndexing 3 sptr #comfunc global IWICJpegFrameDecode_SetIndexing 4 int,int #comfunc global IWICJpegFrameDecode_ClearIndexing 5 #comfunc global IWICJpegFrameDecode_GetAcHuffmanTable 6 int,int,sptr #comfunc global IWICJpegFrameDecode_GetDcHuffmanTable 7 int,int,sptr #comfunc global IWICJpegFrameDecode_GetQuantizationTable 8 int,int,sptr #comfunc global IWICJpegFrameDecode_GetFrameHeader 9 sptr #comfunc global IWICJpegFrameDecode_GetScanHeader 10 int,sptr #comfunc global IWICJpegFrameDecode_CopyScan 11 int,int,int,sptr,sptr #comfunc global IWICJpegFrameDecode_CopyMinimalStream 12 int,int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。