阴影效果

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

此效果的 CLSID CLSID_D2D1Shadow。

示例图

以下示例显示阴影效果的输出,该输出在原始位置中向下和右移,并将源图像复合在它上。 阴影效果仅输出阴影。

之前
the image before the effect.
之后
the image after the transform.
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
投影的颜色。 此属性是定义为: (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) ,如下图所示。

shadow effect output size growth diagram.

要求

要求
最低受支持的客户端 适用于 Windows 7 的 Windows 8 和平台更新 [桌面应用|Windows Microsoft Store应用]
最低受支持的服务器 适用于 Windows 7 的 Windows 8 和平台更新 [桌面应用|Windows Microsoft Store应用]
标头 d2d1effects.h
d2d1.lib、dxguid.lib

ID2D1Effect