阴影效果

使用阴影效果从图像的 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。
Color
D2D1_SHADOW_PROP_COLOR
投影的颜色。 此属性D2D1_VECTOR_4F定义为: (R、G、B、A) 。 必须以直 alpha 指定此颜色。
类型为D2D1_VECTOR_4F。
默认值为 {0.0f, 0.0f, 0.0f, 1.0f}。
Optimization
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 (与设备无关的像素 (DI) ) *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