WPF,Silverlight与XAML读书笔记第三十五 - 可视化效果之图像
说明:本系列基本上是《WPF揭秘》的读书笔记。在结构安排与文章内容上参照《WPF揭秘》的编排,对内容进行了总结并加入一些个人理解。
生成和操作多种格式的图像
WPF中的图像API大都位于System.Windows.Media.Imaging命名空间中。还有一部分定义于System.Windows.Media命名空间。
WPF的API支持的图像格式:Bitmap位图(.bmp),JPEG,TIF与TIFF,GIF,WDP(Windows Media Photo),PNG,ICO另外可以通过Windows图像组件(WIC)来扩展WPF,来支持其他图像格式。
BitmapSource类
BitmapSource位于PresentationCore.dll中的System.Windows.Media.Imaging命名空间。这是我们下文要介绍的图像类的抽象基类。
BitmapImage类
BitmapImage继承自BitmapSource,常与Image控件一起使用。使用BitmapImage而不直接使用Bitmap的Source属性的原因是可以实现如旋转等特点。
示例:
1 <Image> 2 <Image.Source> 3 <BitmapImage UriSource="Logo.jpg" Rotation="Rotate270" /> 4 </Image.Source> 5 </Image>
FormatConvertedBitmap
FormatConvertedBitmap继承自BitmapImage,其属性说明如下,可由此看出这个类的作用 – 转换图像中颜色的深度。
-
Source:指定图像
-
DestinationFormat:目标格式,定义新的颜色深度,该属性是System.Windows.Media.Pixel类。主要包括以下几类格式:
-
Indexed1,Indexed2,Indexed4和Indexed8:分别提供基于调色板的2色,4色,16色,256色位图。
-
BlackWhite:黑白格式
-
Gray,Gray4,Gray8,Gray16和Gray32:分别提供4色,16色,256色,16位和32位灰度图像。
-
Bgr555:提供15位的颜色格式
-
Bgr565:带有6个绿色位的16位颜色格式
-
Bgb128Float:128位色图像
-
位图效果
位图效果定义于System.Windows.Media.Effects命名空间下,一共有5种,它们可以应用到如UIElement,DrawingGroup及Viewport3DVisual等对象。这些效果被应用于渲染过的光栅输出上。
下表列出了5种位图效果的效果图,及各自支持的一些属性。
效果 |
属性 |
默认值 |
效果图(默认值) |
BevelBitmapEffect |
BevelWidth:非负double类型 EdgeProfile:BulgedUp, CurvedIn, CurvedOut或Linear LightAngle:double类型属性,表示以度为单位的角度 Relief:double类型,0(平的)到1(高的)间一个值 Smoothness:double类型,0(清楚)到1(模糊)间的值 |
5 Linear 135 0.3 0.2 |
|
BlurBitmapEffect |
Radius:非负的double类型值 KernelType:Box或Gaussian |
5 Gaussian |
|
DropShadowBitmapEffect |
Color:任何颜色(且颜色可以包含alpha通道) Direction:double类型属性,表示以度为单位的角度 Noise:double类型,0(光滑)到1(不光滑)间的值 Opacity:double类型,0(透明)到1(不透明)间的值 ShadowDepth:非负的double类型值 Softness:double类型,0(清楚)到1(模糊)间的值 |
Black 315 0 1 5 0.5 |
|
EmbossBitmapEffect |
LightAngle:double类型属性,表示以度为单位的角度 Relief:double类型,0到1间的一个值 |
45 0.44 |
|
OuterGlowBitmapEffect |
GlowGolor:任何颜色(且颜色可以包含alpha通道) GlowSize:非负的double类型值 Noise:double类型,0(光滑)到1(不光滑)间的值 Opacity:double类型,0(透明)到1(不透明)间的值 |
Gold 5 0 1 |
应用位图效果的方法很简单,只需要将目标元素的BitmapEffect属性设置为BitmapEffect任一子类的对象即可。如:
1 <Button Width="100">Bevel 2 <Button.BitmapEffect> 3 <BevelBitmapEffect/> 4 </Button.BitmapEffect> 5 </Button>
WPF同样提供了一个BitmapEffectGroup类用于将多个位图效果组合在一起,BitmapEffectGroup的使用方式与普通的BitmapEffect一样,如:
1 <Button Width="100">Bevel 2 <Button.BitmapEffect> 3 <BitmapEffectGroup> 4 <BevelBitmapEffect/> 5 <DropShadowBitmapEffect/> 6 <OuterGlowBitmapEffect/> 7 </BitmapEffectGroup> 8 </Button.BitmapEffect> 9 </Button>
同一个BitmapEffect也可以被多次叠加使用:
1 <Button Width="100">Bevel 2 <Button.BitmapEffect> 3 <BitmapEffectGroup> 4 <DropShadowBitmapEffect/> 5 <DropShadowBitmapEffect/> 6 <DropShadowBitmapEffect/> 7 <DropShadowBitmapEffect/> 8 <DropShadowBitmapEffect/> 9 <DropShadowBitmapEffect/> 10 </BitmapEffectGroup> 11 </Button.BitmapEffect> 12 </Button>
注意:位图效果的性能问题
位图效果在UI线程进行渲染而非渲染线程(前者使用软件计算,后者可借助硬件加速)。对性能的产生的影响会随着位图效果的增多,应该只在小的静态的内容中应用位图效果。
本文完
参考:
《WPF揭秘》