IWICStream
COM公式ドキュメント
イメージングおよびメタデータのコンテンツを参照するための Windows Imaging Component (WIC) ストリームを表します。
解説(Remarks)
デコーダーおよびメタデータハンドラーは、埋め込みメタデータの制御を別のメタデータハンドラーに引き渡す際、自身が保持しているストリームのサブストリームを作成することが求められます。ストリームに制限がない場合は、最大サイズとして MAXLONGLONG、オフセットとして 0 を使用してください。
IWICStream インターフェイスのメソッドでは、ファイル共有オプションを指定することはできません。 画像用のファイルストリームを作成するには、SHCreateStreamOnFileEx 関数を使用してください。 このストリームは、CreateDecoderFromStream メソッドを使用して IWICBitmapDecoder を作成するために利用できます。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
別のストリームからストリームを初期化します。アクセス権は基になるストリームから継承されます。
| pIStream | IStream* | in | 初期化元のストリーム。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
特定のファイルからストリームを初期化します。
| wzFileName | LPWSTR | in | ストリームの初期化に使用するファイル。 | ||||||
| dwDesiredAccess | DWORD | in | 目的のファイルアクセスモード。
|
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
IWICStream インターフェイスのメソッドでは、ファイル共有オプションを指定することはできません。 画像用の共有ファイルストリームを作成するには、SHCreateStreamOnFileEx 関数を使用してください。 このストリームは、CreateDecoderFromStream メソッドを使用して IWICBitmapDecoder を作成するために利用できます。
例
この例では、InitializeFromFilename を使用してイメージデコーダーを作成する方法を示します。
IWICImagingFactory *pFactory = NULL;
IWICStream *pStream = NULL;
IWICBitmapDecoder *pDecoder = NULL;
HRESULT hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pFactory));
// Create the stream.
if (SUCCEEDED(hr))
{
hr = pFactory->CreateStream(&pStream);
}
// Initialize the stream from a specific file.
if (SUCCEEDED(hr))
{
hr = pStream->InitializeFromFilename(L"test.jpg", GENERIC_READ);
}
// Create a JPEG decoder.
// Since the stream is created from the JPEG file, an explicit JPEG decoder
// can be created using the generic IWICImagingFactory::CreateDecoder method.
// However, use IWICImagingFactory::CreateDecoderFromStream method to auto
// detect the stream and instantiate the appropriate codec.
if (SUCCEEDED(hr))
{
hr = pFactory->CreateDecoder(
GUID_ContainerFormatJpeg, // Explicitly create a JPEG decoder.
NULL, // No preferred vendor.
&pDecoder); // Pointer to the decoder.
}
// Initialize the decoder
if (SUCCEEDED(hr))
{
hr = pDecoder->Initialize(
pStream, // The stream to use.
WICDecodeMetadataCacheOnDemand); // Decode metadata when needed.
}
// Process image frame.
if (SUCCEEDED(hr))
{
UINT cFrames = 0;
hr = pDecoder->GetFrameCount(&cFrames);
if (SUCCEEDED(hr) && (cFrames > 0))
{
UINT width = 0, height = 0;
IWICBitmapFrameDecode *pBitmapFrame = NULL;
hr = pDecoder->GetFrame(0, &pBitmapFrame);
if (SUCCEEDED(hr))
{
// Do something with the frame here.
}
if (pBitmapFrame)
{
pBitmapFrame->Release();
}
}
}
if (pStream)
{
pStream->Release();
}
if (pFactory)
{
pFactory->Release();
}
if (pDecoder)
{
pDecoder->Release();
}
メモリブロックをストリームとして扱うようにストリームを初期化します。ストリームはバッファサイズを超えて拡張することはできません。
| pbBuffer | BYTE* | in | ストリームの初期化に使用するバッファへのポインター。 |
| cbBufferSize | DWORD | in | バッファのサイズ。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは可能な限り使用を避けるべきです。InitializeFromMemory を使用する場合、ストリームの有効期間中はメモリブロックが有効であることを保証する責任は呼び出し側にあります。この動作の回避策として、IStream を作成し、InitializeFromIStream を使用して IWICStream を作成する方法があります。
拡張可能なメモリストリームが必要な場合は、CreateStreamOnHGlobal を使用してください。
別のストリームのサブストリームとしてストリームを初期化します。
| pIStream | IStream* | in | 入力ストリームへのポインター。 |
| ulOffset | ULONGLONG | in | 新しいストリームの作成に使用するストリームオフセット。 |
| ulMaxSize | ULONGLONG | in | ストリームの最大サイズ。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このストリームは、基になるストリームとは独立した独自のストリーム位置で機能しますが、特定の領域に制限されます。すべてのシーク位置はサブ領域からの相対位置になります。推奨はされませんが、同じ範囲に重なる複数の書き込み可能なサブストリームを持つことも許可されています。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWICStream "{135FF860-22B7-4DDF-B0F6-218F4F299A43}" #usecom global IWICStream IID_IWICStream "{}" #comfunc global IWICStream_InitializeFromIStream 14 sptr #comfunc global IWICStream_InitializeFromFilename 15 wstr,int #comfunc global IWICStream_InitializeFromMemory 16 var,int #comfunc global IWICStream_InitializeFromIStreamRegion 17 sptr,int64,int64 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWICStream "{135FF860-22B7-4DDF-B0F6-218F4F299A43}" #usecom global IWICStream IID_IWICStream "{}" #comfunc global IWICStream_InitializeFromIStream 14 sptr #comfunc global IWICStream_InitializeFromFilename 15 wstr,int #comfunc global IWICStream_InitializeFromMemory 16 sptr,int #comfunc global IWICStream_InitializeFromIStreamRegion 17 sptr,int64,int64 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。