リソースからビットマップを読み込む方法 (Direct2D)

ファイルからビットマップを読み込む方法」で説明されているように、Direct2D では Windows イメージング コンポーネント (WIC) を使用してビットマップを読み込みます。 リソースからビットマップを読み込むには、WIC オブジェクトを使用してイメージを読み込み、Direct2D 互換の形式に変換します。次に、 CreateBitmapFromWicBitmap メソッドを使用して ID2D1Bitmap を作成します。

  1. アプリケーション リソース定義ファイルで、リソースを定義します。 次の例では、"SampleImage" という名前のリソースを定義します。

    // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
    // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
    // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
    // PARTICULAR PURPOSE.
    //
    // Copyright (c) Microsoft Corporation. All rights reserved
    #include "windows.h"
    
    SampleImage Image "sampleImage.jpg"
    

このリソースは、アプリケーションのビルド時にアプリケーションのリソース ファイルに追加されます。

  1. アプリケーション リソース ファイルからイメージを読み込みます。

    HRESULT DemoApp::LoadResourceBitmap(
        ID2D1RenderTarget *pRenderTarget,
        IWICImagingFactory *pIWICFactory,
        PCWSTR resourceName,
        PCWSTR resourceType,
        UINT destinationWidth,
        UINT destinationHeight,
        ID2D1Bitmap **ppBitmap
        )
    {
        IWICBitmapDecoder *pDecoder = NULL;
        IWICBitmapFrameDecode *pSource = NULL;
        IWICStream *pStream = NULL;
        IWICFormatConverter *pConverter = NULL;
        IWICBitmapScaler *pScaler = NULL;
    
        HRSRC imageResHandle = NULL;
        HGLOBAL imageResDataHandle = NULL;
        void *pImageFile = NULL;
        DWORD imageFileSize = 0;
    
        // Locate the resource.
        imageResHandle = FindResourceW(HINST_THISCOMPONENT, resourceName, resourceType);
        HRESULT hr = imageResHandle ? S_OK : E_FAIL;
        if (SUCCEEDED(hr))
        {
            // Load the resource.
            imageResDataHandle = LoadResource(HINST_THISCOMPONENT, imageResHandle);
    
            hr = imageResDataHandle ? S_OK : E_FAIL;
        }
    
  2. リソースをロックし、イメージのサイズを計算します。

        if (SUCCEEDED(hr))
        {
            // Lock it to get a system memory pointer.
            pImageFile = LockResource(imageResDataHandle);
    
            hr = pImageFile ? S_OK : E_FAIL;
        }
        if (SUCCEEDED(hr))
        {
            // Calculate the size.
            imageFileSize = SizeofResource(HINST_THISCOMPONENT, imageResHandle);
    
            hr = imageFileSize ? S_OK : E_FAIL;
    
        }
    
  3. IWICImagingFactory::CreateStream メソッドを使用して IWICStream オブジェクトを作成します。

        if (SUCCEEDED(hr))
        {
              // Create a WIC stream to map onto the memory.
            hr = pIWICFactory->CreateStream(&pStream);
        }
        if (SUCCEEDED(hr))
        {
            // Initialize the stream with the memory pointer and size.
            hr = pStream->InitializeFromMemory(
                reinterpret_cast<BYTE*>(pImageFile),
                imageFileSize
                );
        }
    
  4. IWICBitmapDecoder を作成するには、IWICImagingFactory::CreateDecoderFromStream メソッドを使用します。

        if (SUCCEEDED(hr))
        {
            // Create a decoder for the stream.
            hr = pIWICFactory->CreateDecoderFromStream(
                pStream,
                NULL,
                WICDecodeMetadataCacheOnLoad,
                &pDecoder
                );
        }
    
  5. イメージからフレームを取得し、 IWICBitmapFrameDecode オブジェクトに格納します。

        if (SUCCEEDED(hr))
        {
            // Create the initial frame.
            hr = pDecoder->GetFrame(0, &pSource);
        }
    
  6. Direct2D でイメージを使用するには、その前に 32bppPBGRA ピクセル形式に変換する必要があります。 イメージ形式を変換するには、 IWICImagingFactory::CreateFormatConverter メソッドを使用して IWICFormatConverter オブジェクトを作成し、 IWICFormatConverter オブジェクトの Initialize メソッドを使用して変換を実行します。

        if (SUCCEEDED(hr))
        {
            // Convert the image format to 32bppPBGRA
            // (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED).
            hr = pIWICFactory->CreateFormatConverter(&pConverter);
        }

       if (SUCCEEDED(hr))
        {           
        hr = pConverter->Initialize(
            pSource,
            GUID_WICPixelFormat32bppPBGRA,
            WICBitmapDitherTypeNone,
            NULL,
            0.f,
            WICBitmapPaletteTypeMedianCut
            );
  1. 最後に、 CreateBitmapFromWicBitmap メソッドを使用して、レンダリング ターゲットによって描画され、他の Direct2D オブジェクトと共に使用できる ID2D1Bitmap オブジェクトを作成します。
        if (SUCCEEDED(hr))
        {
            //create a Direct2D bitmap from the WIC bitmap.
            hr = pRenderTarget->CreateBitmapFromWicBitmap(
                pConverter,
                NULL,
                ppBitmap
                );
    
        }
    
        SafeRelease(&pDecoder);
        SafeRelease(&pSource);
        SafeRelease(&pStream);
        SafeRelease(&pConverter);
        SafeRelease(&pScaler);
    
        return hr;
    }
    

この例では、一部のコードが省略されています。

ファイルからビットマップを読み込む方法