混合效果

使用混合效果合并 2 个图像。 此效果有 26 种混合模式。

此效果的 CLSID 是 CLSID_D2D1Blend。

混合示例

以下是混合效果每种混合模式的示例图像。 混合模式和相应模式属性的完整列表将在下一节中介绍

所有可用混合模式的效果示例屏幕截图。

以下是使用排除模式的另一个示例。

图像 1 混合前
应用效果前的第一个源图像。
图像 2 混合前
应用效果前的第二个图像。
之后
应用转换后的图像。
ComPtr<ID2D1Effect> blendEffect;
m_d2dContext->CreateEffect(CLSID_D2D1Blend, &blendEffect);

blendEffect->SetInput(0, bitmap);
blendEffect->SetInput(1, bitmapTwo);
blendEffect->SetValue(D2D1_BLEND_PROP_MODE, D2D1_BLEND_MODE_EXCLUSION);

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

效果属性

显示名称和索引枚举 说明
“模式”
D2D1_BLEND_PROP_MODE
效果使用的混合模式。 有关详细信息,请参阅混合模式。 类型为 D2D1_BLEND_MODE。
默认值为 D2D1_BLEND_MODE_MULTIPLY。

混合模式

此处的表显示此效果的所有混合模式。 计算效果输出所需的帮助程序函数将在下一节中介绍。

颜色:OPRGB = f(FRGB, BRGB) * FA * BA + FRGB * FA * (1 - BA) + BRGB * BA * (1 - FA)

Alpha:OA = FA * (1 - BA) + BA

其中:

  • OPRGB 是预乘输出颜色
  • OA 是输出 Alpha
  • BRGB 是未预乘目标颜色
  • BA 是目标 alpha
  • FRGB 是未预乘源颜色
  • FA 是源 alpha
  • f(SRGB, DRGB) 是一个混合函数,根据混合模式而变化

某些混合模式需要在色调、饱和度、亮度 (HSL) 颜色空间与 RGB 之间进行转换。

枚举 等式
D2D1_BLEND_MODE_DARKEN 仅限 alpha 的基本混合公式。 加深效果的数学公式。
D2D1_BLEND_MODE_MULTIPLY 仅限 alpha 的基本混合公式。 乘法效果的数学公式。
D2D1_BLEND_MODE_COLOR_BURN 基本混合公式,其中 f(FRGB, BRGB) = 颜色加深效果的数学公式。
D2D1_BLEND_MODE_LINEAR_BURN 基本混合公式,其中 f(FRGB, BRGB) = 线性加深效果的数学公式。
D2D1_BLEND_MODE_DARKER_COLOR 仅限 alpha 的基本混合公式。 加深颜色效果的数学公式。
D2D1_BLEND_MODE_LIGHTEN 仅限 alpha 的基本混合公式。 减淡效果的数学公式。
D2D1_BLEND_MODE_SCREEN 仅限 alpha 的基本混合公式。 屏幕效果的数学公式。
D2D1_BLEND_MODE_COLOR_DODGE 基本混合公式,其中 f(FRGB, BRGB) = 颜色减淡效果的数学公式。
D2D1_BLEND_MODE_LINEAR_DODGE 基本混合公式,其中 f(FRGB, BRGB) = 线性减淡效果的数学公式。
D2D1_BLEND_MODE_LIGHTER_COLOR 仅限 alpha 的基本混合公式。 减淡颜色效果的数学公式。
D2D1_BLEND_MODE_OVERLAY 基本混合公式,其中 f(FRGB, BRGB) = 叠加效果的数学公式。
D2D1_BLEND_MODE_SOFT_LIGHT 基本混合公式,其中 f(FRGB, BRGB) = 柔光效果的数学公式。
D2D1_BLEND_MODE_HARD_LIGHT 基本混合公式,其中 f(FRGB, BRGB) = 强光效果的数学公式。
D2D1_BLEND_MODE_VIVID_LIGHT 基本混合公式,其中 f(FRGB, BRGB) = 生动光效果的数学公式。
D2D1_BLEND_MODE_LINEAR_LIGHT 基本混合公式,其中 f(FRGB, BRGB) = 线性光效果的数学公式。
D2D1_BLEND_MODE_PIN_LIGHT 基本混合公式,其中 f(FRGB, BRGB) = 点光效果的数学公式。
D2D1_BLEND_MODE_HARD_MIX 基本混合公式,其中 f(FRGB, BRGB) = 硬光混合效果的数学公式。
D2D1_BLEND_MODE_DIFFERENCE 基本混合公式,其中 f(FRGB, BRGB) = abs(FRGB - BRGB)
D2D1_BLEND_MODE_EXCLUSION 基本混合公式,其中 f(FRGB, BRGB) = FRGB + BRGB 2 * FRGB * BRGB
D2D1_BLEND_MODE_HUE 仅限 alpha 的基本混合公式。 色调混合效果的数学公式。
D2D1_BLEND_MODE_SATURATION 仅限 alpha 的基本混合公式。 饱和度混合效果的数学公式。
D2D1_BLEND_MODE_COLOR 仅限 alpha 的基本混合公式。 颜色混合效果的数学公式。
D2D1_BLEND_MODE_LUMINOSITY 仅限 alpha 的基本混合公式。 亮度混合效果的数学公式。
D2D1_BLEND_MODE_DISSOLVE 假定为:
  • 当前像素的场景坐标 XY
  • 基于种子坐标 XY 的确定性伪随机数生成器rand(XY),其值无偏差分布在 [0, 1] 范围内

溶解混合效果的数学公式。
D2D1_BLEND_MODE_SUBTRACT 仅限 alpha 的基本混合公式。 相减混合效果的数学公式。
D2D1_BLEND_MODE_DIVISION 仅限 alpha 的基本混合公式。 除法混合效果的数学公式。

注意

对于所有混合模式,输出值预乘并限制在范围 [0, 1]。

HSL 颜色空间转换

亮度分量使用以下 RGB 权重计算:

  • kR = 0.30
  • kG = 0.59
  • kB = 0.11

从 RGB 转换到 HSL

介绍从 rgb 颜色转换到 hsl 颜色的数学公式。

这会将 SL 置于范围 [0.0, 1.0] 而 H 置于范围 [-1.0, 5.0]。

从 HSL 转换到 RGB

为进行反向转换,我们使用之前计算的逆运算。

如果 S = 0 ,则 R = G = B = L

否则,有六种与色调相关的情况:

如果 H 大于 0,则值位于 R>B>G 的红色/洋红色区域。

将 hsl 颜色转换为 rgb 的数学等式的第一步(共六步)。

如果 H 大于或等于 0 且小于 1,则值位于 R>G>B 的红色/黄色区域。

将 hsl 颜色转换为 rgb 的数学等式的第二步(共六步)。

如果 H 大于或等于 1 且小于 2,则值位于 G>R>B 的黄色/绿色区域。

将 hsl 颜色转换为 rgb 的数学等式的第三步(共六步)。

如果 H 大于或等于 2 且小于 3,则值位于 G>B>R 的绿色/蓝绿色区域。

将 hsl 颜色转换为 rgb 的数学等式的第四步(共六步)。

如果 H 大于或等于 3 且小于 4,则值位于 B>G>R 的蓝绿色/蓝色区域。

将 hsl 颜色转换为 rgb 的数学等式的第五步(共六步)。

如果 H 大于或等于 4,则值位于 B>R>G 的蓝色/洋红色区域。

将 hsl 颜色转换为 rgb 的数学等式的第六步(共六步)。

由于混合模式对两种不同颜色的 HSL 分量进行任意组合,因此转换后的 RGB 值通常会超出色域,即一个或多个通道分量可能超出 [0.0, 1.0]的合法范围。 通过最小程度地降低饱和度,同时保留色调和亮度,这些颜色将恢复到色域范围:

描述色域外实例所需更正的数学公式。

输出位图

此效果的输出位图始终是两个输入图像并集的大小。

示例代码

有关此效果的示例,请下载 Direct2D 复合效果模式示例

要求

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

ID2D1Effect