다음을 통해 공유


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

Direct2D는 WIC(Windows 이미징 구성 요소)를 사용하여 비트맵을 로드합니다. 파일에서 비트맵을 로드하려면 먼저 WIC 개체를 사용하여 이미지를 로드하고 Direct2D 호환 형식으로 변환한 다음 CreateBitmapFromWicBitmap 메서드를 사용하여 ID2D1Bitmap을 만듭니다.

  1. IWICImagingFactory::CreateDecoderFromFileName 메서드를 사용하여 IWICBitmapDecoder를 만듭니다.

    HRESULT DemoApp::LoadBitmapFromFile(
        ID2D1RenderTarget *pRenderTarget,
        IWICImagingFactory *pIWICFactory,
        PCWSTR uri,
        UINT destinationWidth,
        UINT destinationHeight,
        ID2D1Bitmap **ppBitmap
        )
    {
        IWICBitmapDecoder *pDecoder = NULL;
        IWICBitmapFrameDecode *pSource = NULL;
        IWICStream *pStream = NULL;
        IWICFormatConverter *pConverter = NULL;
        IWICBitmapScaler *pScaler = NULL;
    
        HRESULT hr = pIWICFactory->CreateDecoderFromFilename(
            uri,
            NULL,
            GENERIC_READ,
            WICDecodeMetadataCacheOnLoad,
            &pDecoder
            );
    
    
  2. 이미지에서 프레임을 검색하고 IWICBitmapFrameDecode 개체에 프레임을 저장합니다.

        if (SUCCEEDED(hr))
        {
            // Create the initial frame.
            hr = pDecoder->GetFrame(0, &pSource);
        }
    
  3. 비트맵은 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
                );
    
  4. 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;
    }
    

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

ID2D1Bitmap

CreateBitmapFromWicBitmap

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