如何防止或关闭位图的 direct2d"自动缩放"?

How to prevent or turn off direct2d "autoscaling" of a bitmap?

本文关键字:缩放 direct2d 何防止 位图      更新时间:2023-10-16

我在 Direct2D 位图缩放方面遇到问题。我使用该示例从文件加载了位图,然后我想自己缩放位图(适合查看保存比例,添加阴影效果......),但 Direct2D 会自动缩放位图(例如,在调整窗口大小时),我不知道如何防止这种行为。

例如,在位图加载到一个小窗口 (CView) 后,它会正确填充整个窗口(根据 OnDraw),当我最大化它时,D2D 会拉伸我的位图,失去位图质量,最后位图大大超过了窗口的边框,尽管我的 OnDraw 方法。

void CWDCView::OnDraw(CDC* /*pDC*/)
{
    CWDCDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc) return;
    HRESULT hr = S_OK;
    ID2D1DeviceContext *deviceContext;
    pRenderTarget->QueryInterface(&deviceContext);  //ID2D1HwndRenderTarget* pRenderTarget
    RECT rc = {0,0,0,0};
    GetClientRect(&rc);
    deviceContext->BeginDraw();
    deviceContext->Clear( D2D1::ColorF( D2D1::ColorF(0xC8D2E1, 1.0f) ) );
    D2D1_RECT_F rect={0,0,rc.right,rc.bottom};
    deviceContext->DrawBitmap(m_pBitmap,rect); //ID2D1Bitmap *m_pBitmap
    deviceContext->EndDraw();
    if (hr == D2DERR_RECREATE_TARGET)
    {
        hr = S_OK;
        ReleaseDeviceResources();
    }
    SafeRelease(&deviceContext);
}

那么如何防止或关闭这种"自动缩放"呢?

我想补充一件事。如果像这样绘制位图deviceContext->DrawBitmap(m_pBitmap); /*without rect*/它只绘制位图的一部分,而不将其放入窗口中,但在最大化时,无论如何都会拉伸它。

呈现目标不能自动调整大小。在您的情况下,您正在更改窗口的大小,但这不会导致"附加"呈现目标大小的更改。

您应该处理窗口的 resize 事件,然后您有两种可能性:

  1. 使用新大小重新创建呈现目标。
  2. 使用ID2D1HwndRenderTarget::ResizeIDXGISwapChain::ResizeBuffers

此外,您还可以检查:

  • WM_SIZE后调整呈现目标 Direct2D 的大小
  • 在 Windows 中平滑调整窗口大小(使用 Direct2D 1.1)?