You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整ID2D1Bitmap尺寸?求可行代码(兼容渲染目标方案报错)

D2D1Bitmap缩放到50%像素的实现方案

直接调用CreateCompatibleRenderTarget不指定格式时,默认使用的像素格式大概率和你原ID2D1Bitmap的格式不匹配,这就是报错的原因。要解决这个问题,你需要先获取原Bitmap的像素格式、DPI等参数,再用这些参数创建匹配的兼容渲染目标,最后完成缩放绘制。

以下是完整的实现代码:

HRESULT ScaleBitmapToHalfSize(ID2D1RenderTarget* pContext, ID2D1Bitmap* pOriginalBitmap, ID2D1Bitmap** ppScaledBitmap)
{
    if (!pContext || !pOriginalBitmap || !ppScaledBitmap)
        return E_INVALIDARG;

    *ppScaledBitmap = nullptr;

    // 1. 获取原Bitmap的基础信息:像素格式、DPI、原始尺寸
    D2D1_PIXEL_FORMAT pixelFormat = pOriginalBitmap->GetPixelFormat();
    FLOAT dpiX, dpiY;
    pOriginalBitmap->GetDpi(&dpiX, &dpiY);
    D2D1_SIZE_U originalSize = pOriginalBitmap->GetPixelSize();

    // 计算缩放到50%后的像素尺寸
    D2D1_SIZE_U scaledSize = { originalSize.width / 2, originalSize.height / 2 };
    if (scaledSize.width == 0 || scaledSize.height == 0)
        return E_INVALIDARG;

    // 2. 创建匹配格式的兼容渲染目标
    ID2D1CompatibleRenderTarget* pCompatibleRT = nullptr;
    HRESULT hr = pContext->CreateCompatibleRenderTarget(
        D2D1::SizeF(static_cast<FLOAT>(scaledSize.width), static_cast<FLOAT>(scaledSize.height)),
        D2D1::SizeU(scaledSize.width, scaledSize.height),
        &pixelFormat,
        D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE,
        &pCompatibleRT
    );

    if (FAILED(hr))
        return hr;

    // 3. 在兼容RT上缩放绘制原Bitmap
    pCompatibleRT->BeginDraw();
    pCompatibleRT->Clear();

    // 计算缩放后的绘制区域
    D2D1_RECT_F destRect = D2D1::RectF(0.0f, 0.0f, static_cast<FLOAT>(scaledSize.width), static_cast<FLOAT>(scaledSize.height));
    pCompatibleRT->DrawBitmap(pOriginalBitmap, destRect);

    hr = pCompatibleRT->EndDraw();
    if (FAILED(hr))
    {
        pCompatibleRT->Release();
        return hr;
    }

    // 4. 从兼容RT中获取缩放后的Bitmap
    hr = pCompatibleRT->GetBitmap(ppScaledBitmap);

    // 释放兼容RT资源
    pCompatibleRT->Release();

    return hr;
}

// 使用示例:在你的渲染流程中调用
void DrawScaledBitmap(ID2D1RenderTarget* pContext, ID2D1Bitmap* pOriginalBitmap)
{
    ID2D1Bitmap* pScaledBitmap = nullptr;
    HRESULT hr = ScaleBitmapToHalfSize(pContext, pOriginalBitmap, &pScaledBitmap);

    if (SUCCEEDED(hr) && pScaledBitmap)
    {
        // 绘制缩放后的Bitmap到目标位置
        pContext->DrawBitmap(pScaledBitmap, D2D1::RectF(50.0f, 50.0f, 50.0f + pScaledBitmap->GetSize().width, 50.0f + pScaledBitmap->GetSize().height));
        pScaledBitmap->Release();
    }
}

代码说明:

  • 先获取原Bitmap的像素格式、DPI和尺寸,确保兼容RT的参数和原Bitmap完全匹配
  • 计算50%缩放后的像素尺寸,避免出现零尺寸的无效情况
  • 创建兼容RT时明确指定像素格式,解决格式不兼容的问题
  • 通过DrawBitmap自动完成缩放绘制,最后从兼容RT提取缩放后的Bitmap

内容的提问来源于stack exchange,提问作者Aftershock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:33:28