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

GetImageLocalBounds返回D2D1_RECT_F正负值含义及高斯模糊定位问题

核心技术问题解答

1. GetImageLocalBounds返回的D2D1_RECT_F中top/left为负值的含义

调用GetImageLocalBounds获取高斯模糊效果的输出图像边界时,left和top为负值是正常现象:

  • 高斯模糊会向输入图像的四周扩散像素,导致输出图像的有效区域超出输入位图的原始范围
  • 输入位图的坐标系原点(0,0)对应输出图像坐标系中的(-模糊扩展量, -模糊扩展量)位置,因此输出的left和top会呈现负值,代表输出区域向左、向上延伸的部分

2. 高斯模糊输出尺寸计算与阴影居中定位方案

尺寸计算规则

  • 输出图像的实际DIP宽度 = img_rect.right - img_rect.left
  • 输出图像的实际DIP高度 = img_rect.bottom - img_rect.top
  • 关于你提到的文档公式:

输出位图增长(X和Y方向)= 标准差(DIP)×6×((用户DPI)/96)
该公式计算的是像素单位的总扩展量(左右/上下各扩展3倍标准差的像素量)。而GetImageLocalBounds返回的是DIP单位,因此需要将公式结果除以(当前DPI/96),才能得到DIP单位的扩展量,与(right-left - 输入宽度)的结果一致。

阴影居中定位实现

要让原矩形精准位于阴影中心,只需保证两者的中心点重合,具体代码实现如下:

  1. 计算原矩形的中心点:
// 假设原矩形为D2D1_RECT_F类型的rect
D2D1_POINT_2F rect_center = {
    (rect.left + rect.right) / 2.0f,
    (rect.top + rect.bottom) / 2.0f
};
  1. 计算模糊后阴影图像的中心点:
D2D1_POINT_2F shadow_center = {
    (img_rect.left + img_rect.right) / 2.0f,
    (img_rect.top + img_rect.bottom) / 2.0f
};
  1. 计算阴影需要平移的偏移量,使阴影中心与原矩形中心重合:
D2D1_POINT_2F shadow_offset = {
    rect_center.x - shadow_center.x,
    rect_center.y - shadow_center.y
};
  1. 按偏移量绘制阴影,再绘制原矩形:
// 应用平移变换绘制阴影
d2d_context_->SetTransform(D2D1::Matrix3x2F::Translation(shadow_offset.x, shadow_offset.y));
d2d_context_->DrawImage(out_img.Get());

// 恢复默认变换,绘制原矩形
d2d_context_->SetTransform(D2D1::Matrix3x2F::Identity());
d2d_context_->FillRectangle(rect, your_fill_brush);

额外优化提示

  • 你设置D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION为shadow_opts.width *3的逻辑是正确的,符合微软文档中“模糊半径=标准差×3”的定义
  • 若需要避免模糊边缘的半透明扩散,可以尝试将D2D1_GAUSSIANBLUR_PROP_BORDER_MODE设置为D2D1_BORDER_MODE_HARD,但这会让阴影边缘更生硬,需根据视觉需求选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:27:59