Freigeben über


Zeichnen einer BitmapSource mit Direct2D

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

So zeichnen Sie eine Bitmapquelle mit Direct2D

  1. Decodieren Sie ein Quellbild, und rufen Sie eine Bitmapquelle ab. In diesem Beispiel wird ein IWICBitmapDecoder verwendet, um das Bild zu decodieren, 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 Typen von Bitmapquellen, die gezeichnet werden sollen, finden Sie unter Übersicht über Bitmapquellen.

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

    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 der Erstellung die Initialize-Methode , um die Konvertierung auszufü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 zum Rendern in einem Fensterhandle.

       // 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 mit 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 aus diesem Beispiel weggelassen. Den vollständigen Code finden Sie im Beispiel wic Image Viewer using Direct2D (WIC-Bildanzeige mithilfe von Direct2D).

Weitere Informationen

Programmierhandbuch

Referenz

Beispiele

Direct2D