不透明度掩码概述

不透明度掩码使元素或视觉对象的一部分变得完全透明或部分透明。 若要创建不透明度掩码,请将Brush应用于元素的OpacityMask属性或Visual。 画笔映射到元素或视觉对象。每个画笔像素的不透明度值被用于确定元素或视觉对象中相应像素的最终不透明度。

先决条件

此概述假定你熟悉 Brush 对象。 有关使用画笔的简介,请参阅 “使用纯色和渐变绘制”概述。 有关ImageBrushDrawingBrush的信息,请参阅图像、绘图和视觉设计的应用

使用不透明度掩码创建视觉效果

不透明度掩码的工作原理是将其内容映射到元素或视觉对象。 然后,每个画笔像素的 alpha 通道用于确定元素或视觉效果的相应像素的最终不透明度,而忽略画笔的实际颜色。 如果画笔的给定部分是透明的,则元素或视觉对象的相应部分变为透明。 如果画笔的给定部分不透明,则元素或视觉对象的相应部分的不透明度保持不变。 不透明度掩码指定的不透明度与元素或视觉对象中存在的任何不透明度设置相结合。 例如,如果元素为 25% 不透明,并且应用不透明掩码,该掩码从完全不透明转换为完全透明,则结果是从 25% 不透明度转换为完全透明的元素。

注释

尽管本概述中的示例演示了对图像元素使用不透明度掩码,但不透明度掩码可以应用于任何元素,或者 Visual包括面板和控件。

不透明度掩码用于创建有趣的视觉效果,例如创建从视图中淡出的图像或按钮,向元素添加纹理,或组合渐变以生成类似玻璃的表面。 下图演示了不透明度掩码的使用。 棋盘背景图案用于显示掩码的透明部分。

具有 LinearGradientBrush 不透明度掩码的对象
不透明度掩码示例

创建不透明度掩码

若要创建不透明度掩码,请创建并将其 Brush 应用于 OpacityMask 元素或视觉对象的属性。 可以使用任何类型的 Brush 不透明度掩码。

  • LinearGradientBrushRadialGradientBrush:用于使元素或视觉对象从视图中淡出。

    下图显示了用作不透明度掩码的一个 LinearGradientBrush

    具有 LinearGradientBrush 不透明度掩码wcpsdk_graphicsmm_brushes_lineagradientopacitymasksingle的对象
    LinearGradientBrush 不透明度掩码示例

  • ImageBrush:用于创建纹理和柔化或撕裂边缘效果。

    下图显示了一个 ImageBrush 作为透明度掩码。

    具有 ImageBrush 不透明度掩码的对象
    LinearGradientBrush 不透明度掩码示例

  • DrawingBrush:用于从形状、图像和渐变模式创建复杂的不透明度掩码。

    下图显示了用作不透明度掩码的一个 DrawingBrush

    具有 DrawingBrush 不透明度掩码
    DrawingBrush 不透明度掩码示例

渐变画笔(LinearGradientBrushRadialGradientBrush)特别适合用作不透明度掩码。 由于 SolidColorBrush 填充一个区域会产生统一的颜色,因此它们不适合作为不透明度掩码;使用 SolidColorBrush 等同于设置元素或视觉对象的 Opacity 属性。

使用渐变作为不透明度掩码

若要创建渐变填充,请指定两个或更多渐变停止点。 每个渐变停止点都包含描述颜色和位置(有关创建和使用渐变的详细信息,请参阅 “使用纯色和渐变绘制”概述 )。 当将渐变用作不透明度掩码时,该过程是相同的,不同之处在于,不透明度掩码渐变混合 alpha 通道值。 因此,渐变内容的实际颜色并不重要:只有每种颜色的 alpha 通道或不透明度很重要。 下面是一个示例。

<!--With the opacity mask:--> 
<Image
  Width="200" Height="150"
  Source="sampleImages\Waterlilies.jpg"
  Margin="10"
  HorizontalAlignment="Left"
  Grid.Column="2" Grid.Row="3">
  <Image.OpacityMask>
    <LinearGradientBrush StartPoint="0.1,0.1" EndPoint="0.75,0.75">
      <LinearGradientBrush.GradientStops>
        <GradientStop Offset="0" Color="Black"/>
        <GradientStop Offset="1" Color="Transparent"/>
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Image.OpacityMask>
</Image>

指定不透明度掩码的渐变停止点

在前面的示例中,系统定义的颜色 Black 用作渐变的起始颜色。 由于 Colors 类中的所有颜色都完全不透明,除 Transparent 外,它们可用于简单地定义渐变不透明度掩码的起始颜色。

若要在定义不透明度掩码时对 alpha 值进行其他控制,可以使用标记中的 ARGB 十六进制表示法或使用 Color.FromScRgb 该方法指定颜色的 alpha 通道。

在“XAML”中指定颜色不透明度

在可扩展应用程序标记语言(XAML)中,使用 ARGB 十六进制表示法指定各个颜色的不透明度。 ARGB 十六进制表示法使用以下语法:

# aarrggbb

上一行中的 aa 表示用于指定颜色不透明度的两位数十六进制值。 rrggbb 分别表示两位数的十六进制值,用于指定颜色中的红色、绿色和蓝色量。 每个十六进制数字可能具有 0-9 或 A-F 的值。 0 是最小值,F 是最大值。 alpha 值为 00 指定完全透明的颜色,而 FF 的 alpha 值则创建完全不透明的颜色。 在以下示例中,十六进制 ARGB 表示法用于指定两种颜色。 第一个完全不透明,而第二个完全透明。

<Canvas.OpacityMask>
  <RadialGradientBrush>
    <RadialGradientBrush.GradientStops>
      <GradientStop Offset="0" Color="#FF000000"/>
      <GradientStop Offset="1" Color="#00000000"/>
  </RadialGradientBrush.GradientStops>
</RadialGradientBrush>
</Canvas.OpacityMask>

将图像用作不透明度掩码

图像还可以用作不透明度掩码。 下图显示了一个示例。 检查背景用于显示掩码的透明部分。

具有 ImageBrush 不透明度掩码的对象
不透明度掩码示例

若要将图像用作不透明度掩码,请使用包含 ImageBrush 图像。 创建要用作不透明度掩码的图像时,请将图像保存为支持多个透明度级别的格式,例如可移植网络图形(PNG)。 下面的示例演示用于创建上图的代码。

<!-- With the Opacity Mask-->
<Image
  Height="150"
  Width="200"
  Source="sampleImages/Waterlilies.jpg"
  HorizontalAlignment="Left"
  Margin="10"
  Grid.Column="2" Grid.Row="1">
  <Image.OpacityMask>
    <ImageBrush ImageSource="sampleImages/tornedges.png"/>
  </Image.OpacityMask>
</Image>

将平铺图像用作不透明度掩码

在下面的示例中,同一图像用于另一个 ImageBrush图像,但画笔的平铺功能用于生成图像 50 像素方形的磁贴。

<!-- With the Opacity Mask -->
<Image
  Height="150"
  Width="200"
  Source="sampleImages/Waterlilies.jpg"
  HorizontalAlignment="Left"
  Margin="10"
  Grid.Column="2" Grid.Row="2">

  <Image.OpacityMask>
    <ImageBrush
      Viewport="0,0,50,50"
      ViewportUnits="Absolute"
      TileMode="Tile" 
      ImageSource="sampleImages/tornedges.png"/>
  </Image.OpacityMask>
</Image>

从绘图创建不透明度掩码

绘图可以使用不透明度掩码。 绘图中包含的形状本身可以填充渐变、纯色、图像,甚至其他绘图。 下图显示了用作不透明度掩码的绘图示例。 检查背景用于显示掩码的透明部分。

具有 DrawingBrush 不透明度掩码wcpsdk_drawingbrushasopacitymask的对象
DrawingBrush 不透明度掩码示例

若要将绘图用作不透明度掩码,请使用 DrawingBrush 包含绘图。 以下示例演示用于创建上图的代码:

<!-- With the Opacity Mask-->
<Image 
      Grid.Row="4" Grid.Column="5"
      Height="150"
      Width="200"
      Source="sampleImages/Waterlilies.jpg">
  <Image.OpacityMask>
    <DrawingBrush>
      <DrawingBrush.Drawing>
        <GeometryDrawing>
          <GeometryDrawing.Brush>
            <RadialGradientBrush>
              <RadialGradientBrush.GradientStops>
                <GradientStop Offset="0" Color="Black" />
                <GradientStop Offset="1" Color="Transparent" />
              </RadialGradientBrush.GradientStops>
            </RadialGradientBrush>
          </GeometryDrawing.Brush>
          <GeometryDrawing.Geometry>
            <RectangleGeometry Rect="0.05,0.05 0.9,0.9" />
          </GeometryDrawing.Geometry>
          <GeometryDrawing.Pen>
            <Pen Thickness="0.1" Brush="Black" />
          </GeometryDrawing.Pen>
        </GeometryDrawing>
      </DrawingBrush.Drawing>
    </DrawingBrush>
  </Image.OpacityMask>
</Image>

将平铺图形用作不透明度掩码

ImageBrush 一样,DrawingBrush 可以平铺其绘图。 在以下示例中,绘图画笔用于创建平铺不透明度掩码。

<!-- With the Opacity Mask-->
<Button
   Grid.Row="8" Grid.Column="5"
  Height="100"
  Width="200"
  FontFamily="MS Gothic"
  FontSize="16">
  A Button
  <Button.OpacityMask>
    <DrawingBrush Viewport="0,0,0.25,0.25" TileMode="Tile">
      <DrawingBrush.Drawing>
        <GeometryDrawing>
          <GeometryDrawing.Brush>
            <RadialGradientBrush>
              <RadialGradientBrush.GradientStops>
                <GradientStop Offset="0" Color="Black" />
                <GradientStop Offset="1" Color="Transparent" />
              </RadialGradientBrush.GradientStops>
            </RadialGradientBrush>
          </GeometryDrawing.Brush>
          <GeometryDrawing.Geometry>
            <RectangleGeometry Rect="0.05,0.05 0.9,0.9" />
          </GeometryDrawing.Geometry>
          <GeometryDrawing.Pen>
            <Pen Thickness="0.1" Brush="Black" />
          </GeometryDrawing.Pen>
        </GeometryDrawing>
      </DrawingBrush.Drawing>
    </DrawingBrush>
  </Button.OpacityMask>
</Button>

另请参阅