2016-02-27 1 views
1

J'essaye de dessiner un bitmap à l'écran; le code qui appelle pour charger le bitmap à partir d'un fichier fonctionne, mais il semble que la partie de dessin réelle provoque des plantages de programme.Chargement et dessin de bitmap Direct2D

J'ai suivi un tutoriel de MSDN, mais le seul changement que j'ai fait était d'utiliser ID2D1RenderTarget, j'utilise un ID2D1DCRenderTarget.

Voici la méthode de chargement qui fonctionne:

HRESULT LoadBitmapFromFile(
    ID2D1DCRenderTarget *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 
     ); 



    if (SUCCEEDED(hr)) 
    { 
     // Create the initial frame. 
     hr = pDecoder->GetFrame(0, &pSource); 
    } 
    if (SUCCEEDED(hr)) 
    { 

     // Convert the image format to 32bppPBGRA 
     // (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED). 
     hr = pIWICFactory->CreateFormatConverter(&pConverter); 

    } 


    if (SUCCEEDED(hr)) 
    { 
     // If a new width or height was specified, create an 
     // IWICBitmapScaler and use it to resize the image. 
     if (destinationWidth != 0 || destinationHeight != 0) 
     { 
      UINT originalWidth, originalHeight; 
      hr = pSource->GetSize(&originalWidth, &originalHeight); 
      if (SUCCEEDED(hr)) 
      { 
       if (destinationWidth == 0) 
       { 
        FLOAT scalar = static_cast<FLOAT>(destinationHeight)/static_cast<FLOAT>(originalHeight); 
        destinationWidth = static_cast<UINT>(scalar * static_cast<FLOAT>(originalWidth)); 
       } 
       else if (destinationHeight == 0) 
       { 
        FLOAT scalar = static_cast<FLOAT>(destinationWidth)/static_cast<FLOAT>(originalWidth); 
        destinationHeight = static_cast<UINT>(scalar * static_cast<FLOAT>(originalHeight)); 
       } 

       hr = pIWICFactory->CreateBitmapScaler(&pScaler); 
       if (SUCCEEDED(hr)) 
       { 
        hr = pScaler->Initialize(
         pSource, 
         destinationWidth, 
         destinationHeight, 
         WICBitmapInterpolationModeCubic 
         ); 
       } 
       if (SUCCEEDED(hr)) 
       { 
        hr = pConverter->Initialize(
         pScaler, 
         GUID_WICPixelFormat32bppPBGRA, 
         WICBitmapDitherTypeNone, 
         NULL, 
         0.f, 
         WICBitmapPaletteTypeMedianCut 
         ); 
       } 
      } 
     } 
     else // Don't scale the image. 
     { 
      hr = pConverter->Initialize(
       pSource, 
       GUID_WICPixelFormat32bppPBGRA, 
       WICBitmapDitherTypeNone, 
       NULL, 
       0.f, 
       WICBitmapPaletteTypeMedianCut 
       ); 
     } 
    } 
    if (SUCCEEDED(hr)) 
    { 

     // Create a Direct2D bitmap from the WIC bitmap. 
     hr = pRenderTarget->CreateBitmapFromWicBitmap(
      pConverter, 
      NULL, 
      ppBitmap 
      ); 
    } 

    if (pDecoder) pDecoder->Release(); 
    if (pSource) pSource->Release(); 
    if (pStream) pStream->Release(); 
    if (pScaler) pScaler->Release(); 

    return hr; 
} 

et entre les BeginDraw() et EndDraw() pour la cible de rendu, je le code suivant pour dessiner le bitmap. Ceci est la partie qui bloque le programme lorsque je tente de l'exécuter:

d2dg->pRT->BeginDraw(); 

// Create a WIC Factory 
HRESULT hr = CoCreateInstance(
CLSID_WICImagingFactory, 
NULL, 
CLSCTX_INPROC_SERVER, 
IID_IWICImagingFactory, 
(LPVOID*)&wicFactory); 

hr = LoadBitmapFromFile(d2dg->pRT, wicFactory, L"image1.png", 400, 400, &pBitmap); 

D2D1_SIZE_F size = pBitmap->GetSize(); 
D2D1_POINT_2F upperLeftCorner = D2D1::Point2F(100.f, 10.f); 
// Draw a bitmap. 
d2dg->pRT->DrawBitmap(
    pBitmap, 
    D2D1::RectF(
    upperLeftCorner.x, 
    upperLeftCorner.y, 
    upperLeftCorner.x + size.width, 
    upperLeftCorner.y + size.height) 
    ); 

d2dg->pRT->EndDraw(); 

Répondre

0

ajoute que la question à ceci: le bitmap que je voulais dessiner était encore NULL.

Ceci peut être corrigé en supprimant le paramètre ID2D1Bitmap **ppBitmap de LoadBitmapFromFile et de travailler simplement avec le pointeur sur &pBitmap pour toute référence à un bitmap dans la méthode.

De cette façon, pBitmap est manipulé et ne restera pas NULL.