阴影效果

使用阴影效果从图像的 alpha 通道生成阴影。 对于较高的 alpha 值,阴影更不透明,对于较低的 alpha 值更透明。 可以设置模糊量和阴影的颜色。

此效果的 CLSID CLSID_D2D1Shadow。

示例图像

此处的示例显示了阴影效果的输出,该输出在原始位置中向下和右侧组合了源图像。 阴影效果仅输出阴影。

以前
在效果之前 图像。
转换后 图像。
ComPtr<ID2D1Effect> shadowEffect;
m_d2dContext->CreateEffect(CLSID_D2D1Shadow, &shadowEffect);

shadowEffect->SetInput(0, bitmap);

// Shadow is composited on top of a white surface to show opacity.
ComPtr<ID2D1Effect> floodEffect;
m_d2dContext->CreateEffect(CLSID_D2D1Flood, &floodEffect);

floodEffect->SetValue(D2D1_FLOOD_PROP_COLOR, D2D1::Vector4F(1.0f, 1.0f, 1.0f, 1.0f));

ComPtr<ID2D1Effect> affineTransformEffect;
m_d2dContext->CreateEffect(CLSID_D2D12DAffineTransform, &affineTransformEffect);

affineTransformEffect->SetInputEffect(0, shadowEffect.Get());

D2D1_MATRIX_3X2_F matrix = D2D1::Matrix3x2F::Translation(20, 20));

affineTransformEffect->SetValue(D2D1_2DAFFINETRANSFORM_PROP_TRANSFORM_MATRIX, matrix);

ComPtr<ID2D1Effect> compositeEffect;
m_d2dContext->CreateEffect(CLSID_D2D1Composite, &compositeEffect);

compositeEffect->SetInputEffect(0, floodEffect.Get());
compositeEffect->SetInputEffect(1, affineTransformEffect.Get());
compositeEffect->SetInput(2, bitmap);

m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(compositeEffect.Get());
m_d2dContext->EndDraw();

效果属性

显示名称和索引枚举 描述
BlurStandardDeviation
D2D1_SHADOW_PROP_BLUR_STANDARD_DEVIATION
要应用于图像 alpha 通道的模糊量。 可以通过将标准偏差乘以 3 来计算内核的模糊半径。 标准偏差和模糊半径的单位都是 DIP。
此属性与 高斯模糊 标准偏差属性相同。
类型为 FLOAT。
默认值为 3.0f。
颜色
D2D1_SHADOW_PROP_COLOR
阴影的颜色。 此属性是定义为:(R、G、B、A)的D2D1_VECTOR_4F。 必须用直线 alpha 指定此颜色。
类型为D2D1_VECTOR_4F。
默认值为 {0.0f、0.0f、0.0f、1.0f}。
优化
D2D1_SHADOW_PROP_OPTIMIZATION
性能优化级别。
类型为D2D1_SHADOW_OPTIMIZATION。
默认值为D2D1_SHADOW_OPTIMIZATION_BALANCED。

优化模式

名字 描述
D2D1_DIRECTIONALBLUR_OPTIMIZATION_SPEED 应用内部优化,例如以相对较小的弧度预先缩放。 使用线性筛选。
D2D1_DIRECTIONALBLUR_OPTIMIZATION_BALANCED 使用与速度模式相同的优化阈值,但使用三线性筛选。
D2D1_DIRECTIONALBLUR_OPTIMIZATION_QUALITY 仅使用具有大模糊弧度的内部优化,其中近似值不太可能可见。 使用三线性筛选。

输出位图

输出位图的大小是模糊输出的大小。 可以使用以下公式计算输出位图相对于原始位图的增长量:

输出位图增长 (X 和 Y) = BlurStandardDeviation (与设备无关的像素(DIP)*6*(用户 DPI)/96

输出在所有方向上都同样增加,因此,例如,如果每个方向的大小增加 10 像素,位图的左上角位于 (-5, -5), 右下角将位于 (105, 105), 如下图所示。

阴影效果输出大小增长关系图。

要求

要求 价值
支持的最低客户端 适用于 Windows 7 的 Windows 8 和平台更新 [桌面应用 |Windows 应用商店应用]
支持的最低服务器 适用于 Windows 7 的 Windows 8 和平台更新 [桌面应用 |Windows 应用商店应用]
页眉 d2d1effects.h
图书馆 d2d1.lib、dxguid.lib

ID2D1Effect