Cara Memuat Bitmap dari Sumber Daya (Direct2D)

Seperti yang dijelaskan dalam Cara Memuat Bitmap dari File, Direct2D menggunakan Komponen Pencitraan Windows (WIC) untuk memuat bitmap. Untuk memuat bitmap dari sumber daya, gunakan objek WIC untuk memuat gambar dan mengonversinya ke format yang kompatibel dengan Direct2D; kemudian, gunakan metode CreateBitmapFromWicBitmap untuk membuat ID2D1Bitmap.

  1. Dalam file definisi sumber daya aplikasi, tentukan sumber daya. Contoh berikut mendefinisikan sumber daya bernama "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"
    

Sumber daya ini akan ditambahkan ke file sumber daya aplikasi saat aplikasi dibuat.

  1. Muat gambar dari file sumber daya aplikasi.

    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. Kunci sumber daya dan hitung ukuran gambar.

        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. Gunakan metode IWICImagingFactory::CreateStream untuk membuat objek 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. Gunakan metode IWICImagingFactory::CreateDecoderFromStream untuk membuat IWICBitmapDecoder.

        if (SUCCEEDED(hr))
        {
            // Create a decoder for the stream.
            hr = pIWICFactory->CreateDecoderFromStream(
                pStream,
                NULL,
                WICDecodeMetadataCacheOnLoad,
                &pDecoder
                );
        }
    
  5. Ambil bingkai dari gambar dan simpan dalam objek IWICBitmapFrameDecode .

        if (SUCCEEDED(hr))
        {
            // Create the initial frame.
            hr = pDecoder->GetFrame(0, &pSource);
        }
    
  6. Sebelum Direct2D dapat menggunakan gambar, gambar harus dikonversi ke format piksel 32bppPBGRA. Untuk mengonversi format gambar, gunakan metode IWICImagingFactory::CreateFormatConverter untuk membuat objek IWICFormatConverter, lalu gunakan metode Initialize objek IWICFormatConverter untuk melakukan konversi.

        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. Terakhir, gunakan metode CreateBitmapFromWicBitmap untuk membuat objek ID2D1Bitmap yang dapat digambar oleh target render dan digunakan dengan objek Direct2D lainnya.
        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;
    }
    

Beberapa kode telah dihilangkan dari contoh ini.

Cara Memuat Bitmap dari File