图形效果、位图处理与打印功能全解析
立即解锁
发布时间: 2025-08-26 01:21:47 阅读量: 2 订阅数: 17 


Silverlight开发实战精要
### 图形效果、位图处理与打印功能全解析
在图形处理和界面设计中,我们常常需要使用各种效果来增强视觉体验,同时也会涉及到位图的生成、处理以及打印等操作。下面我们将详细介绍几种常见的图形效果、WriteableBitmap 类的使用以及 Silverlight 的打印功能。
#### 常见图形效果
##### BlurEffect
BlurEffect 是一种简单的效果类,它可以模糊元素的内容,就好像你通过一个失焦的镜头看东西一样。你可以通过增加 Radius 属性的值来提高模糊程度,该属性的默认值为 5。
使用任何像素着色器效果时,你需要创建相应的效果对象,并设置对应元素的 Effect 属性。以下是一个示例:
```xml
<Button Content="Blurred (Radius=2)" Padding="5" Margin="3">
<Button.Effect>
<BlurEffect Radius="2"></BlurEffect>
</Button.Effect>
</Button>
```
##### DropShadowEffect
DropShadowEffect 可以在元素后面添加一个稍微偏移的阴影。它有几个属性可供调整,具体如下表所示:
| 属性名 | 描述 |
| ---- | ---- |
| Color | 设置投影的颜色,默认值为黑色。 |
| ShadowDepth | 确定阴影与内容的距离,以像素为单位,默认值为 5。 |
| BlurRadius | 模糊投影,类似于 BlurEffect 的 Radius 属性,默认值为 5。 |
| Opacity | 使用 0 到 1 之间的小数使投影部分透明,1 表示完全不透明(默认值),0 表示完全透明。 |
| Direction | 指定投影相对于内容的位置,以 0 到 360 度的角度表示。0 表示将阴影放在右侧,增加该值可使阴影逆时针移动,默认值为 315,将阴影放在元素的右下角。 |
以下是几个不同投影效果的 TextBlock 示例:
```xml
<TextBlock FontSize="20" Margin="3">
<TextBlock.Effect>
<DropShadowEffect></DropShadowEffect>
</TextBlock.Effect>
<TextBlock.Text>Basic dropshadow</TextBlock.Text>
</TextBlock>
<TextBlock FontSize="20" Margin="3">
<TextBlock.Effect>
<DropShadowEffect Color="SlateBlue"></DropShadowEffect>
</TextBlock.Effect>
<TextBlock.Text>Light blue dropshadow</TextBlock.Text>
</TextBlock>
<TextBlock FontSize="20" Foreground="White" Margin="3">
<TextBlock.Effect>
<DropShadowEffect BlurRadius="15"></DropShadowEffect>
</TextBlock.Effect>
<TextBlock.Text>Blurred dropshadow with white text</TextBlock.Text>
</TextBlock>
<TextBlock FontSize="20" Foreground="Magenta" Margin="3">
<TextBlock.Effect>
<DropShadowEffect ShadowDepth="0"></DropShadowEffect>
</TextBlock.Effect>
<TextBlock.Text>Close dropshadow</TextBlock.Text>
</TextBlock>
<TextBlock FontSize="20" Foreground="LimeGreen" Margin="3">
<TextBlock.Effect>
<DropShadowEffect ShadowDepth="25"></DropShadowEffect>
</TextBlock.Effect>
<TextBlock.Text>Distant dropshadow</TextBlock.Text>
</TextBlock>
```
需要注意的是,目前没有用于组合效果的类,这意味着你一次只能对一个元素应用一个效果。不过,你可以通过将效果添加到更高级别的容器中来模拟多种效果,但这种方法会增加渲染工作并降低性能,因此大多数情况下应尽量避免。
#### ShaderEffect
ShaderEffect 类本身并不是一个可以直接使用的效果,而是一个必须继承的类,你可以从它派生出自定义的像素着色器。通过使用 ShaderEffect 或基于它的第三方自定义效果,你可以实现比简单的模糊和投影更复杂的效果。
像素着色器的逻辑不是直接用 VB 代码写在效果类中的,而是使用高级着色器语言(HLSL)编写,HLSL 是 DirectX 的一部分。由于 DirectX 和 HLSL 已经存在多年,图形开发者已经创建了大量的像素着色器例程,你可以在自己的代码中使用这些例程。
要创建一个像素着色器,你需要编写正确的 HLSL 代码。第一步是安装 DirectX SDK(访问 http://msdn.microsoft.com/directx),这样你就可以使用 fxc.exe 命令行工具将 HLSL 代码编译成 .ps 文件,这是使用自定义 ShaderEffect 类所必需的。更方便的选择是使用免费的 Shazzam 工具(http://shazzam-tool.com),它提供了一个 HLSL 文件编辑器,还可以在示例图像上测试这些文件,并且包含了一些示例像素着色器,你可以将其作为自定义效果的基础。
以下是使用自定义像素着色器的步骤:
1. 将编译好的 .ps 文件添加到现有的 Silverlight 项目中。
2. 在解决方案资源管理器中选择该文件,并将其生成操作设置为资源。
3. 创建一个从 ShaderEffect 派生的自定义类,并使用该资源。
以下是一个示例代码:
```vb
Public Class CustomEffect
Inherits ShaderEffect
Public Sub New()
' 使用第 6 章中描述的 URI 语法引用你的资源。
' AssemblyName;component/ResourceFileName
Dim pixelShaderUri As New Uri( _
"CustomEffectTest;component/Effect.ps", UriKind.Relative)
' 加载 .ps 文件中的信息。
PixelShader = New PixelShader()
PixelShader.UriSource = pixelShaderUri
End Sub
End Class
```
在页面中使用自定义像素着色器的步骤如下:
1. 通过添加映射使命名空间可用:
```xml
<UserControl xmlns:local="clr-namespace:CustomEffectTest" ...>
```
2. 创建自定义效果类的实例,并设置元素的 Effect 属性:
```xml
<Image>
<Image.Effect>
<local:CustomEffect></local:CustomEffect>
</Image.Effect>
</Image>
```
如果你使用的像素着色器需要特定的输入参数,则需要通过调用共享的 RegisterPixelShaderSamplerProperty() 方法来创建相应的依赖属性。
#### WriteableBitmap 类
在之前的学习中,我们使用 Image 元素来显示位图,但这种方式是单向的,Image 元素本身无法让你创建或编辑位图信息。WriteableBitmap 类则解决了这个问题,它派生自 BitmapSource 类,当你设置 Image.Source 属性时会使用到这个类。与 BitmapSource 不同的是,WriteableBitmap 是一个可修改的像素数组,为你提供了更多有趣的可能性。
##### 生成位图
使用 WriteableBitmap 最直接的方法是手动创建整个位图。这个过程可能看起来很繁琐,但如果你想创建分形图形或为音乐、科学数据创建可视化效果,它将是一个非常有用的工具。
生成位图的步骤如下:
1. 创建内存中的位图,并指定其宽度和高度(以像素为单位)。例如,创建一个与当前页面大小相同的图像:
```vb
Dim wb As New WriteableBitmap(CInt(Me.ActualWidth), CInt(Me.ActualHeight))
```
2. 填充像素。你可以使用 Pixels 属性,它提供了一个一维像素数组。数组中的像素从左到右填充每一行,从上到下排列。要找到特定的像素,需要使用以下公式:
```
y * wb.PixelWidth + x
```
例如,设置像素 (40, 100) 的代码如下:
```vb
wb.Pixels(100 * wb.PixelWidth + 40) = ...
```
每个像素的颜色由一个无符号整数表示,要构造这个整数,需要将颜色的 alpha、红色、绿色和蓝色值(每个值都是 0 到 255 之间的一个字节)组合在一起。最简便的方法是使用位运算:
```vb
Dim alpha As Integer = 255
Dim red As Integer = 100
Dim green As Integer =
```
0
0
复制全文
相关推荐










