如何调整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
相关产品推荐
相关产品推荐

