2014-02-13 3 views
1

질문은 this과 매우 유사하지만 아직 답변을 얻지 못했습니다. 내 질문은, 나는 d2dfactory -> CreateDxgiSurfaceRenderTarget()에서 D2D DXGI RenderTarget을 가지고 있으며, WIC를 사용하여 이미지 파일에 내용을 저장하려고합니다. 그냥 thisthis을 읽고 있었기 때문에 WIC 렌더 타겟에 ID2D1Bitmap을 만들고 ID2D1Bitmap :: CopyFromRenderTarget()을 사용하여 입력 렌더 타겟에서 복사를 할 수 없다는 것을 알았습니다. 사용하고 있기 때문에 저장하려고합니다. 다른 자원. 이 코드를 잘못Direct2D : ID2D1RenderTarget의 내용을 이미지 파일에 저장하는 방법은 무엇입니까?

HRESULT SaveRenderTargetToFile(
    ID2D1RenderTarget* pRTSrc, 
    LPCWSTR uri 
    ) 
{ 
    HRESULT hr = S_OK; 

    ComPtr<IWICBitmap> spWICBitmap; 
    ComPtr<ID2D1RenderTarget> spRT; 
    ComPtr<IWICBitmapEncoder> spEncoder; 
    ComPtr<IWICBitmapFrameEncode> spFrameEncode; 
    ComPtr<IWICStream> spStream; 

    // 
    // Create WIC bitmap to save and associated render target 
    // 

    UINT bitmapWidth = static_cast<UINT>(pRTSrc->GetSize().width + .5f); 
    UINT bitmapHeight = static_cast<UINT>(pRTSrc->GetSize().height + .5f); 

    HR(m_spWICFactory->CreateBitmap(
     bitmapWidth, 
     bitmapHeight, 
     GUID_WICPixelFormat32bppPBGRA, 
     WICBitmapCacheOnLoad, 
     &spWICBitmap 
     )); 

    D2D1_RENDER_TARGET_PROPERTIES prop = D2D1::RenderTargetProperties(); 
    prop.pixelFormat = D2D1::PixelFormat(
     DXGI_FORMAT_B8G8R8A8_UNORM, 
     D2D1_ALPHA_MODE_PREMULTIPLIED 
     ); 
    prop.type = D2D1_RENDER_TARGET_TYPE_DEFAULT; 
    prop.usage = D2D1_RENDER_TARGET_USAGE_NONE; 
    HR(m_spD2D1Factory->CreateWicBitmapRenderTarget(
     spWICBitmap, 
     prop, 
     &spRT 
     )); 

    // 
    // Create a shared bitmap from this RenderTarget 
    // 
    ComPtr<ID2D1Bitmap> spBitmap; 
    D2D1_BITMAP_PROPERTIES bp = D2D1::BitmapProperties(); 
    bp.pixelFormat = prop.pixelFormat; 

    HR(spRT->CreateSharedBitmap(
     __uuidof(IWICBitmap), 
     static_cast<void*>(spWICBitmap.GetRawPointer()), 
     &bp, 
     &spBitmap 
     )); // <------------------------- This fails with E_INVALIDARG 

    // 
    // Copy the source RenderTarget to this bitmap 
    // 
    HR(spBitmap->CopyFromRenderTarget(nullptr, pRTSrc, nullptr)); 

    // 
    // Draw this bitmap to the output render target 
    // 

    spRT->BeginDraw(); 
    spRT->Clear(D2D1::ColorF(D2D1::ColorF::GreenYellow)); 
    spRT->DrawBitmap(spBitmap); 
    HR(spRT->EndDraw()); 

    // 
    // Save image to file 
    // 

    HR(m_spWICFactory->CreateStream(&spStream)); 
    WICPixelFormatGUID format = GUID_WICPixelFormat32bppPBGRA; 
    HR(spStream->InitializeFromFilename(uri, GENERIC_WRITE)); 

    HR(m_spWICFactory->CreateEncoder(GUID_ContainerFormatPng, nullptr, &spEncoder)); 
    HR(spEncoder->Initialize(spStream, WICBitmapEncoderNoCache)); 
    HR(spEncoder->CreateNewFrame(&spFrameEncode, nullptr)); 
    HR(spFrameEncode->Initialize(nullptr)); 
    HR(spFrameEncode->SetSize(bitmapWidth, bitmapHeight)); 
    HR(spFrameEncode->SetPixelFormat(&format)); 
    HR(spFrameEncode->WriteSource(spWICBitmap, nullptr)); 
    HR(spFrameEncode->Commit()); 
    HR(spEncoder->Commit()); 
    HR(spStream->Commit(STGC_DEFAULT)); 

done: 
    return hr; 
} 

아무것도 : 그래서 여기에 내가 ID2D1RenderTarget :: CreateSharedBitmap()를 사용하여 내놓았다 무엇인가? (나는 확실히 많이있다 :)) MSDN의 어딘가에는 WIC 렌더 타겟이 소프트웨어 모드만을 지원하고, DXGI 렌더 타겟은 하드웨어 모드 만 지원한다고되어있다. 이것이 CreateSharedBitmap()에 대한 위의 호출이 실패하는 이유입니까? D2D를 사용하여 DXGI 표면 콘텐츠를 이미지 파일에 저장하려면 어떻게해야합니까?

답변

2
  1. 몇 가지 제한 사항으로, 당신은 D3DX11SaveTextureToFile를 사용할 수 있습니다. 표면에 QI를 사용하여 ID3D11Resource을 얻으십시오. 그들이 대체 CaptureTexture 후 (XXX는 WIC이다 DDS 또는 TGA)로 SaveToXXXFile DirectXTex 라이브러리를 권장하고 동일한 페이지에

  2. . 그래서 다른 옵션이 있습니다.

  3. 또한 표면이 GDI 호환으로 작성된 경우 IDXGISurface1::GetDC을 사용할 수 있습니다. (IDXGISurface1을 얻으려면 IDXGurface에서 QI를 사용하십시오.) DC를 파일에 저장하는 것은 독자의 연습 과제로 남겨 둡니다.

E_INVALIDARG처럼 비밀 리턴 코드와 함께 도움을 Debug Layer을 사용해야합니다.

0

당신은 (내가하지 않은)이 시도 할 수 :

  • 가 이전 DXGISurface를 확인합니다.
  • 보조 ID2D1DeviceContext 렌더링 대상을 만듭니다.
  • ID2D1DeviceContext :: CreateBitmapFromDxgiSurface를 사용하여 DXGI 표면에 연결된 ID2D1Bitmap1을 만듭니다.
  • DXG 표면에 그립니다. ID2D1Bitmap1에서도 같은 결과를 얻어야합니다.
  • ID2D1Bitmap1 :: Map을 사용하여 픽셀 데이터에 대한 메모리 포인터를 가져옵니다.
  • pixeldata가 파일에 복사 또는 부호화 (JPEG, TIFF 등)
에 대한 wicbitmap
관련 문제