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揭秘》

posted @ 2013-01-06 09:06  hystar  阅读(286)  评论(0编辑  收藏  举报