Zeichnen einer BitmapSource mit Direct2D

In diesem Thema wird der Prozess zum Zeichnen einer IWICBitmapSource mit Direct2D veranschaulicht.

So zeichnen Sie eine Bitmapquelle mit Direct2D

  1. Decodieren Sie ein Quellbild, und erhalten Sie eine Bitmapquelle. In diesem Beispiel wird zum Decodieren des Bilds ein IWICBitmapDecoder verwendet, und der erste Bildrahmen wird abgerufen.

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

    Weitere Zu zeichnende Bitmapquellentypen finden Sie in der Übersicht über Bitmapquellen.

  2. Konvertieren Sie die Bitmapquelle in ein Pixelformat von 32bppPBGRA.

    Bevor Direct2D ein Bild verwenden kann, muss es in das Pixelformat 32bppPBGRA konvertiert werden. Verwenden Sie zum Konvertieren des Bildformats die CreateFormatConverter-Methode, um ein IWICFormatConverter-Objekt zu erstellen. Verwenden Sie nach dem Erstellen die Initialize-Methode, um die Konvertierung durchzuführen.

       // 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. Erstellen Sie ein ID2D1RenderTarget-Objekt für das Rendern in einem Fensterhandpunkt.

       // 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
           );
    

    Weitere Informationen zu Renderzielen finden Sie in der Übersicht über Direct2D-Renderziele.

  4. Erstellen Sie mithilfe der ID2D1RenderTarget::CreateBitmapFromWicBitmap-Methode ein ID2D1Bitmap-Objekt.

        // 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. Zeichnen Sie die ID2D1Bitmap mithilfe der D2D ID2D1RenderTarget::D rawBitmap-Methode.

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

Code wurde in diesem Beispiel weggelassen. Den vollständigen Code finden Sie unter WIC Image Viewer Using Direct2D Sample (WIC-Bildanzeige mit direct2D-Beispiel).

Weitere Informationen

Programmierhandbuch

Referenz

Beispiele

Direct2D