Win32 API 日本語リファレンス
ホームGraphics.Imaging › IWICStream

IWICStream

COM
IID135ff860-22b7-4ddf-b0f6-218f4f299a43継承元IStream自前メソッド開始 vtbl14

公式ドキュメント

イメージングおよびメタデータのコンテンツを参照するための Windows Imaging Component (WIC) ストリームを表します。

解説(Remarks)

デコーダーおよびメタデータハンドラーは、埋め込みメタデータの制御を別のメタデータハンドラーに引き渡す際、自身が保持しているストリームのサブストリームを作成することが求められます。ストリームに制限がない場合は、最大サイズとして MAXLONGLONG、オフセットとして 0 を使用してください。

IWICStream インターフェイスのメソッドでは、ファイル共有オプションを指定することはできません。 画像用のファイルストリームを作成するには、SHCreateStreamOnFileEx 関数を使用してください。 このストリームは、CreateDecoderFromStream メソッドを使用して IWICBitmapDecoder を作成するために利用できます。

メソッド 4

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 14 HRESULT InitializeFromIStream(IStream* pIStream)

別のストリームからストリームを初期化します。アクセス権は基になるストリームから継承されます。

pIStreamIStream*in初期化元のストリーム。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

vtbl 15 HRESULT InitializeFromFilename(LPWSTR wzFileName, DWORD dwDesiredAccess)

特定のファイルからストリームを初期化します。

wzFileNameLPWSTRinストリームの初期化に使用するファイル。
dwDesiredAccessDWORDin

目的のファイルアクセスモード。

意味
GENERIC_READ
読み取りアクセス。
GENERIC_WRITE
書き込みアクセス。

戻り値

型: 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();
    }
vtbl 16 HRESULT InitializeFromMemory(BYTE* pbBuffer, DWORD cbBufferSize)

メモリブロックをストリームとして扱うようにストリームを初期化します。ストリームはバッファサイズを超えて拡張することはできません。

pbBufferBYTE*inストリームの初期化に使用するバッファへのポインター。
cbBufferSizeDWORDinバッファのサイズ。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

このメソッドは可能な限り使用を避けるべきです。InitializeFromMemory を使用する場合、ストリームの有効期間中はメモリブロックが有効であることを保証する責任は呼び出し側にあります。この動作の回避策として、IStream を作成し、InitializeFromIStream を使用して IWICStream を作成する方法があります。

拡張可能なメモリストリームが必要な場合は、CreateStreamOnHGlobal を使用してください。

vtbl 17 HRESULT InitializeFromIStreamRegion(IStream* pIStream, ULONGLONG ulOffset, ULONGLONG ulMaxSize)

別のストリームのサブストリームとしてストリームを初期化します。

pIStreamIStream*in入力ストリームへのポインター。
ulOffsetULONGLONGin新しいストリームの作成に使用するストリームオフセット。
ulMaxSizeULONGLONGinストリームの最大サイズ。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

このストリームは、基になるストリームとは独立した独自のストリーム位置で機能しますが、特定の領域に制限されます。すべてのシーク位置はサブ領域からの相対位置になります。推奨はされませんが、同じ範囲に重なる複数の書き込み可能なサブストリームを持つことも許可されています。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。