Direct2D将当前呈现器目标内容保存为位图

来源:互联网 发布:用js表示阶层 编辑:程序博客网 时间:2024/05/20 07:59

  直接上代码了。

  

 IWICImagingFactory *pIWICImagingFatory = nullptr;IWICBitmap* pWICBitmap = nullptr;ID2D1Bitmap* pD2DBitmap = nullptr;IWICStream* pStream = nullptr;ID2D1RenderTarget* pDRT = nullptr;IWICBitmapEncoder* pEncoder = nullptr;IWICBitmapFrameEncode* pFEncode = nullptr;

  

void Direct2D::Copy(){HRESULT hr = E_FAIL;bool IfSuccess = false;CreateDeviceResources();WICPixelFormatGUID format = GUID_WICPixelFormatDontCare;D2D1_POINT_2U destPoint = D2D1::Point2U();D2D1_RECT_U Rect = D2D1::RectU(0, 0, pRT->GetSize().width, pRT->GetSize().height);D2D1_RECT_F Rect2 = D2D1::RectF(0, 0, pRT->GetSize().width, pRT->GetSize().height);__try{hr = pRT->CreateBitmap(D2D1_SIZE_U{ pRT->GetSize().width, pRT->GetSize().height }, BitmapProperties(PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,D2D1_ALPHA_MODE_PREMULTIPLIED)), &pD2DBitmap);if (!SUCCEEDED(hr)) __leave;hr = pD2DBitmap->CopyFromRenderTarget(&destPoint, pRT, &Rect);if (!SUCCEEDED(hr)) __leave;hr = pIWICImagingFatory->CreateBitmap(pRT->GetSize().width, pRT->GetSize().height, GUID_WICPixelFormat32bppPBGRA, WICBitmapCacheOnDemand, &pWICBitmap);if (!SUCCEEDED(hr)) __leave;hr = pFactory->CreateWicBitmapRenderTarget(pWICBitmap, RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_SOFTWARE, D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED)), &pDRT);if (!SUCCEEDED(hr)) __leave;pDRT->BeginDraw();pDRT->Clear(0);pDRT->DrawBitmap(pD2DBitmap, Rect2, 1.0f, D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, Rect2);hr = pDRT->EndDraw();if (!SUCCEEDED(hr)) __leave;hr = pIWICImagingFatory->CreateStream(&pStream);if (!SUCCEEDED(hr)) __leave;hr = pStream->InitializeFromFilename(L"..\\output.jpg", GENERIC_WRITE);if (!SUCCEEDED(hr)) __leave;hr = pIWICImagingFatory->CreateEncoder(GUID_ContainerFormatJpeg, nullptr, &pEncoder);if (!SUCCEEDED(hr)) __leave;hr = pEncoder->Initialize(pStream, WICBitmapEncoderNoCache);if (!SUCCEEDED(hr)) __leave;hr = pEncoder->CreateNewFrame(&pFEncode, nullptr);if (!SUCCEEDED(hr)) __leave;hr = pFEncode->Initialize(nullptr);if (!SUCCEEDED(hr)) __leave;hr = pFEncode->SetSize(pRT->GetSize().width, pRT->GetSize().height);if (!SUCCEEDED(hr)) __leave;hr = pFEncode->SetPixelFormat(&format);if (!SUCCEEDED(hr)) __leave;hr = pFEncode->WriteSource(pWICBitmap, nullptr);if (!SUCCEEDED(hr)) __leave;hr = pFEncode->Commit();if (!SUCCEEDED(hr)) __leave;hr = pEncoder->Commit();if (!SUCCEEDED(hr)) __leave;IfSuccess = true;}__finally{if (!IfSuccess){FailMsgBox();}}}
  此处切记,我这里的pRT是一个HwndRenderTarget,如果想要运行此代码在CreateHwndRenderTarge的时候必须将该呈现器目标改为软件呈现器目标。代码如下:

  

hr = pFactory->CreateHwndRenderTarget(RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_SOFTWARE, D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED)),HwndRenderTargetProperties(hWnd, size),&pRT);
  所以说,将呈现器目标的内容保存为位图会大幅度降低程序的效率。

0 0
原创粉丝点击