IWICColorTransform::Initialize メソッド (wincodec.h)

IWICBitmapSource を使用して IWICColorTransform を初期化し、IWICColorContext から別の IWICColorContext に変換します。

構文

HRESULT Initialize(
  [in] IWICBitmapSource      *pIBitmapSource,
  [in] IWICColorContext      *pIContextSource,
  [in] IWICColorContext      *pIContextDest,
  [in] REFWICPixelFormatGUID pixelFmtDest
);

パラメーター

[in] pIBitmapSource

種類: IWICBitmapSource*

カラー変換の初期化に使用されるビットマップ ソース。

[in] pIContextSource

種類: IWICColorContext*

カラー コンテキスト ソース。

[in] pIContextDest

種類: IWICColorContext*

色コンテキストの変換先。

[in] pixelFmtDest

種類: REFWICPixelFormatGUID

目的のピクセル形式の GUID。

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

戻り値

種類: HRESULT

このメソッドは、成功すると S_OK を返します。 そうでない場合は、HRESULT エラー コードを返します。

解説

pIContextSource パラメーターと pixelFmtDest パラメーターで現在サポートされている形式は次のとおりです。

  • GUID_WICPixelFormat8bppGray
  • GUID_WICPixelFormat16bppGray
  • GUID_WICPixelFormat16bppBGR555
  • GUID_WICPixelFormat16bppBGR565
  • GUID_WICPixelFormat24bppBGR
  • GUID_WICPixelFormat24bppRGB
  • GUID_WICPixelFormat32bppBGR
  • GUID_WICPixelFormat32bppBGRA
  • GUID_WICPixelFormat32bppPBGRA
  • GUID_WICPixelFormat32bppPRGBA (Windows 8 以降)
  • GUID_WICPixelFormat32bppRGBA
  • GUID_WICPixelFormat32bppBGR101010
  • GUID_WICPixelFormat32bppCMYK
  • GUID_WICPixelFormat48bppBGR
  • GUID_WICPixelFormat64bppBGRA (Windows 8 以降)
  • GUID_WICPixelFormat64bppPBGRA (Windows 8 以降)
  • GUID_WICPixelFormat64bppPRGBA (Windows 8 以降)
  • GUID_WICPixelFormat64bppRGBA (Windows 8 以降)
カラー変換から正しい動作を取得するには、入力ピクセルと出力ピクセルの形式がソースとターゲットのカラー プロファイルと互換性がある必要があります。 たとえば、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))
    {
        // Transform from src icm to the 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;

要件

   
サポートされている最小のクライアント WINDOWS XP と SP2、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー wincodec.h
Library Windowscodecs.lib
[DLL] Windowscodecs.dll