Condividi tramite


Come disegnare una BitmapSource usando Direct2D

In questo argomento viene illustrato il processo di disegno di un oggetto IWICBitmapSource usando Direct2D.

Per disegnare un'origine bitmap usando Direct2D

  1. Decodificare un'immagine di origine e ottenere un'origine bitmap. In questo esempio viene usato un IWICBitmapDecoder per decodificare l'immagine e il primo frame di immagine viene recuperato.

       // Create a decoder
       IWICBitmapDecoder *pDecoder = NULL;
    
       hr = m_pIWICFactory->CreateDecoderFromFilename(
           szFileName,                      // Image to be decoded
           NULL,                            // Do not prefer a particular vendor
           GENERIC_READ,                    // Desired read access to the file
           WICDecodeMetadataCacheOnDemand,  // Cache metadata when needed
           &pDecoder                        // Pointer to the decoder
           );
    
       // Retrieve the first frame of the image from the decoder
       IWICBitmapFrameDecode *pFrame = NULL;
    
       if (SUCCEEDED(hr))
       {
           hr = pDecoder->GetFrame(0, &pFrame);
       }
    

    Per altri tipi di origini bitmap da disegnare, vedere Panoramica delle origini bitmap.

  2. Convertire l'origine bitmap in un formato pixel 32bppPBGRA.

    Prima che Direct2D possa usare un'immagine, deve essere convertita nel formato pixel 32bppPBGRA. Per convertire il formato immagine, usare il metodo CreateFormatConverter per creare un oggetto IWICFormatConverter . Dopo aver creato, usare il metodo Initialize per eseguire la conversione.

       // Format convert the frame to 32bppPBGRA
       if (SUCCEEDED(hr))
       {
           SafeRelease(&m_pConvertedSourceBitmap);
           hr = m_pIWICFactory->CreateFormatConverter(&m_pConvertedSourceBitmap);
       }
    
       if (SUCCEEDED(hr))
       {
           hr = m_pConvertedSourceBitmap->Initialize(
               pFrame,                          // Input bitmap to convert
               GUID_WICPixelFormat32bppPBGRA,   // Destination pixel format
               WICBitmapDitherTypeNone,         // Specified dither pattern
               NULL,                            // Specify a particular palette 
               0.f,                             // Alpha threshold
               WICBitmapPaletteTypeCustom       // Palette translation type
               );
       }
    
  3. Creare un oggetto ID2D1RenderTarget per il rendering in un handle di finestra.

       // Create a D2D render target properties
       D2D1_RENDER_TARGET_PROPERTIES renderTargetProperties = D2D1::RenderTargetProperties();
    
       // Set the DPI to be the default system DPI to allow direct mapping
       // between image pixels and desktop pixels in different system DPI settings
       renderTargetProperties.dpiX = DEFAULT_DPI;
       renderTargetProperties.dpiY = DEFAULT_DPI;
    
       // Create a D2D render target
       D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);
    
       hr = m_pD2DFactory->CreateHwndRenderTarget(
           renderTargetProperties,
           D2D1::HwndRenderTargetProperties(hWnd, size),
           &m_pRT
           );
    

    Per altre informazioni sulle destinazioni di rendering, vedere Panoramica delle destinazioni di rendering Direct2D.

  4. Creare un oggetto ID2D1Bitmap usando il metodo ID2D1RenderTarget::CreateBitmapFromWicBitmap .

        // D2DBitmap may have been released due to device loss. 
        // If so, re-create it from the source bitmap
        if (m_pConvertedSourceBitmap && !m_pD2DBitmap)
        {
            m_pRT->CreateBitmapFromWicBitmap(m_pConvertedSourceBitmap, NULL, &m_pD2DBitmap);
        }
    
  5. Disegna l'ID2D1Bitmap usando il metodo D2DID2D1RenderTarget::D rawBitmap .

        // Draws an image and scales it to the current window size
        if (m_pD2DBitmap)
        {
            m_pRT->DrawBitmap(m_pD2DBitmap, rectangle);
        }
    

Il codice è stato omesso da questo esempio. Per il codice completo, vedere Il visualizzatore di immagini WIC usando l'esempio Direct2D.

Vedere anche

Guida per programmatori

Riferimento

Esempi

Direct2D