다음을 통해 공유


리소스에서 비트맵을 로드하는 방법(Direct2D)

파일에서 비트맵을 로드하는 방법에 설명된 대로 Direct2D는 WIC(Windows 이미징 구성 요소)를 사용하여 비트맵을 로드합니다. 리소스에서 비트맵을 로드하려면 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. IWICImagingFactory::CreateDecoderFromStream 메서드를 사용하여 IWICBitmapDecoder를 만듭니다.

        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;
    }
    

일부 코드는 이 예제에서 생략되었습니다.

파일에서 비트맵을 로드하는 방법