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

IWICColorTransform

COM
IIDb66f034f-d0e2-40ab-b436-6de39e321a94継承元IWICBitmapSource自前メソッド開始 vtbl8

公式ドキュメント

IWICBitmapSource をあるカラーコンテキストから別のカラーコンテキストへ変換するメソッドを公開します。

解説(Remarks)

IWICColorTransform は、指定された IWICBitmapSource から取得したピクセルをカラー変換を通して取り出す方法を知っている、イメージングパイプラインのコンポーネントです。カラー変換は、ソースのカラーコンテキストから変換先のカラーコンテキストへ、指定された出力ピクセルフォーマットで色をマッピングすることによって定義されます。

一度初期化したカラー変換は、再初期化できません。そのため、カラー変換を複数のソースや異なるパラメーターで使用することはできません。

メソッド 1

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

vtbl 8 HRESULT Initialize(IWICBitmapSource* pIBitmapSource, IWICColorContext* pIContextSource, IWICColorContext* pIContextDest, GUID* pixelFmtDest)

IWICColorTransform を IWICBitmapSource で初期化し、それをある IWICColorContext から別の IWICColorContext へ変換します。

pIBitmapSourceIWICBitmapSource*inカラー変換の初期化に使用するビットマップソース。
pIContextSourceIWICColorContext*in変換元のカラーコンテキスト。
pIContextDestIWICColorContext*in変換先のカラーコンテキスト。
pixelFmtDestGUID*in

目的とするピクセルフォーマットの GUID。

このパラメーターは、ネイティブな WIC ピクセルフォーマットのサブセットに限定されます。一覧については「解説」を参照してください。

戻り値

型: HRESULT

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

解説(Remarks)

pIContextSource および pixelFmtDest パラメーターで現在サポートされているフォーマットは次のとおりです。

カラー変換から正しい動作を得るには、入力および出力のピクセルフォーマットが、変換元および変換先のカラープロファイルと互換性を持つ必要があります。たとえば、sRGB の変換先カラープロファイルを CMYK の変換先ピクセルフォーマットと組み合わせて使用すると、正しくない結果が生成されます。

次の例では、ある IWICColorContext から別の IWICColorContext へのカラー変換を実行します。


    IWICImagingFactory *pFactory = NULL;
    IWICBitmapDecoder *pDecoder = NULL;
    IWICBitmapFrameDecode *pBitmapFrame = NULL;
    IWICColorContext *pContextSrc = NULL;
    IWICColorContext *pContextDst = NULL;
    IWICColorTransform *pColorTransform = NULL;

    UINT uiFrameCount = 0;

    HRESULT hr = CoCreateInstance(
                    CLSID_WICImagingFactory,
                    NULL, CLSCTX_INPROC_SERVER,
                    IID_IWICImagingFactory,
                    (LPVOID*) &pFactory);

    if (SUCCEEDED(hr))
    {
        hr = pFactory->CreateDecoderFromFilename(
                           L"test.jpg",
                           NULL,
                           GENERIC_READ,
                           WICDecodeMetadataCacheOnDemand,
                           &pDecoder);
    }

    if (SUCCEEDED(hr))
    {
        hr = pDecoder->GetFrameCount(&uiFrameCount);
    }

    if (SUCCEEDED(hr) && (uiFrameCount > 0))
    {
        hr = pDecoder->GetFrame(0, &piBitmapFrame);
    }

    if (SUCCEEDED(hr))
    {
        hr = pFactory->CreateColorContext(&pContextSrc);
    }

    if (SUCCEEDED(hr))
    {
        hr = pContextSrc->InitializeFromFilename(
                              L"c:\\windows\\system32\\spool\\drivers\\color\\kodak_dc.icm");
    }

    if (SUCCEEDED(hr))
    {
        hr = pFactory->CreateColorContext(&pContextDst);
    }

    if (SUCCEEDED(hr))
    {
        hr = pContextDst->InitializeFromFilename(
                              L"c:\\windows\\system32\\spool\\drivers\\color\\sRGB Color Space Profile.icm");
    }

    hr = E_FAIL;

    if (SUCCEEDED(hr))
    {
        // src icm から destination icm へ変換します。 
        hr = pColorTransform->Initialize( pBitmapFrame,
                                          pContextSrc,
                                          pContextDst,
                                          GUID_WICPixelFormat32bppBGRA);
    }

    if (SUCCEEDED(hr))
    {
        UINT uiWidth = 0, uiHeight = 0;
        UINT cbStride = 0;
        UINT cbBufferSize = 0;
        BYTE *pbBuffer = NULL; 

        hr = pColorTransform->GetSize(&uiWidth, &uiHeight);

        if (SUCCEEDED(hr))
        {
            WICRect rc = { 0 };
            rc.X = 0;
            rc.Y = 0;
            rc.Width = uiWidth;
            rc.Height = 1; // scanline

            for (UINT i = 0; SUCCEEDED(hr) && (i < uiHeight); i++)
            {
                hr = pColorTransform->CopyPixels(&rc, cbStride, cbBufferSize - (rc.Y * cbStride), pbBuffer);
                pbBuffer += cbStride;
                rc.Y += 1;
            }
        }
    }

    if (pFactory)
    {
        pFactory->Release();
    }

    if (pDecoder)
    {
        pDecoder->Release();
    }

    if (pBitmapFrame)
    {
        pBitmapFrame->Release();
    }

    if (pContextSrc)
    {
        pContextSrc->Release();
    }

    if (pContextDst)
    {
        pContextDst->Release();
    }

    if (pColorTransform)
    {
        pColorTransform->Release();
    }

    return hr;
出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IWICColorTransform "{B66F034F-D0E2-40AB-B436-6DE39E321A94}"
#usecom global IWICColorTransform IID_IWICColorTransform "{}"
#comfunc global IWICColorTransform_Initialize  8 sptr,sptr,sptr,var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。