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

使用WinAPI的TransparentBlt函数如何调整位图缩放比例?

使用TransparentBlt实现位图缩放的修改方法

TransparentBlt的缩放逻辑很直接,通过目标区域的宽高参数和源位图的宽高参数的差异来实现缩放。你的当前代码中目标宽高和源宽高都是Width、Height,所以是1:1等比例绘制。要调整缩放比例,只需修改目标区域的宽高,同时调整居中位置的计算即可。

修改步骤:

  1. 定义缩放因子:比如要放大到2倍就设float scale = 2.0f,缩小到0.5倍就设float scale = 0.5f。
  2. 计算缩放后的目标宽高:用源宽高乘以缩放因子。
  3. 修正居中位置的计算:因为要保持位图在vPos处居中,所以X、Y坐标的偏移量要基于缩放后的宽高来计算。

修改后的代码示例:

float scale = 2.0f; // 缩放因子,可根据需求调整
int destWidth = static_cast<int>(Width * scale);
int destHeight = static_cast<int>(Height * scale);

TransparentBlt(_dc
        , static_cast<int>(vPos.x - (destWidth / 2.0f))
        , static_cast<int>(vPos.y - (destHeight / 2.0f))
        , destWidth, destHeight // 目标区域宽高(缩放后的尺寸)
        , m_pImage->GetDC()
        , 0, 0, Width, Height // 源位图的原始宽高
        , RGB(255, 0, 255));

额外说明:

  • 如果需要非等比例缩放,分别给宽和高设置不同的缩放因子即可,比如destWidth = static_cast<int>(Width * 1.5f),destHeight = static_cast<int>(Height * 0.8f)。
  • 直接用TransparentBlt缩放可能会出现锯齿,若追求更平滑的效果,可以先将源位图缩放至目标尺寸(比如用StretchBlt绘制到内存DC),再用TransparentBlt绘制到目标DC。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:15:35