概述
Silverlight 2 Beta
1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#,
IronRuby, Ironpython,对JSON、Web
Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight
2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发。
本文将介绍在Silverlight 2中进行图片的处理,包括图片的拉伸、裁剪、半透明遮罩等内容。
创建图片
创
建图片,我们可以直接使用Image控件或者在上一篇讲过的ImageBrush,使用ImageBrush可以填充图形或者控件的前景色、背景色等,只
需要指定ImageSource属性。注意,在Silverlight 2 Beta 1中,目前似乎只支持.png格式的图片。
<CanvasBackground="#CDFCAE">ITPUB个人空间G C1}s~$hK}W.C*F
<RectangleCanvas.Left="20"Canvas.Top="80"
+iE c"Q0_H8A0Width="240"Height="136"RadiusX="15"RadiusY="15">
2xO9x;y;s2oW7MVbH*o5]0<Rectangle.Fill>ITPUB个人空间`1u,@(JY qD3iyX
<ImageBrushImageSource="a1.png"></ImageBrush>
1QdwT` v0</Rectangle.Fill>ITPUB个人空间hTI8?}z
</Rectangle>
A3S*XL4U$F0
V.^Uy/O C0<ImageSource="b1.png"Canvas.Left="320"Canvas.Top="80"></Image>ITPUB个人空间lT:P p5^S4oBT
</Canvas>
运行后如下所示:
5t!n:y8^a7_O r/w0
ITPUB个人空间~;a/hk[/]^]h
图片拉伸
当我们创建了一个图片的时候,如果不指定它的宽度和高度,它将会使用默认的规格来显示;如果指定了高和宽,图片将显示在指定高和宽的矩形区域内。可以通过苏醒Stretch来指定图片如何填充在该区域内,即图片拉伸。Stretch属性具有四个可选值:
None:不对图片进行拉伸以便填充规定的尺寸。
Uniform:按比例进行拉伸,直到有一边满足规定的尺寸区域为止,其余部分不会被填充,按最小尺寸填充。
UniformToFill:按比例进行拉伸,直到完全填充规定的尺寸区域为止,超出该区域的将会被裁剪,按最大尺寸填充。
Fill:不按比例拉伸,完全填充规定的尺寸区域,将会破坏图像的比例。
Stretch默认的属性是Uniform,为了更直观的看到这个四个值的区别,下面看一个例子,我们使用一个规格尺寸为160*90图片,中间带一个小的正方形:ITPUB个人空间q%i@;Le
ITPUB个人空间?1_$F o~
在页面上放置四个Border控件,大小为220*220,并在其中各放置一个Image,图片的大小也定义为220*220,设置四个Image的Stretch属性分别为None、Uniform、UniformToFill、Fill,如下所示:
<CanvasBackground="#CDFCAE">ITPUB个人空间%B:Y8YDJ}
<BorderBorderBrush="Black"BorderThickness="3"
V/dd&Co1Jz'N p}6ef&O0Width="220"Height="220"Canvas.Left="40"Canvas.Top="50">ITPUB个人空间$SF%t6q!cO4xY(d
<ImageSource="a2.png"Stretch="None"Width="220"Height="220"></Image>ITPUB个人空间 \Mz U[%w[)JD
</Border>ITPUB个人空间ws*nWmn4f#U+Z%CUg
ITPUB个人空间(?b8gue
<BorderBorderBrush="Black"BorderThickness="3"ITPUB个人空间}ob$N"N!fG5OgA
Width="220"Height="220"Canvas.Left="330"Canvas.Top="50">
f/D5d$b
J0<ImageSource="a2.png"Stretch="Uniform"Width="220"Height="220"></Image>
7U1M)g)~)jO,C6W0</Border>
d`Cmtr-P-Z6\8]0
0V(J+T;?`0<BorderBorderBrush="Black"BorderThickness="3"ITPUB个人空间n%{"g.A.g1gJ6_Rqe
Width="220"Height="220"Canvas.Left="330"Canvas.Top="330">ITPUB个人空间uq4Y.vM6~OmmF
<ImageSource="a2.png"Stretch="UniformToFill"Width="220"Height="220"></Image>
\6F| \9X.q*GrN0</Border>
"T)V,y_)x{0ITPUB个人空间/baE
fg
<BorderBorderBrush="Black"BorderThickness="3"
-kFhAS'k3vq0Width="220"Height="220"Canvas.Left="40"Canvas.Top="330">ITPUB个人空间c6i1vM/Ad?X
<ImageSource="a2.png"Stretch="Fill"Width="220"Height="220"></Image>ITPUB个人空间;A0q9BTr}5|:PK
</Border>
dSWY l0</Canvas>
运行后可以很明显的看到这个四个值的区别,如下图所示:

5at|5eWjG
nxx0裁剪图片
有时候我们只需要显示出图片的一部分,可以使用Clip属性对图片进行裁剪,在Clip属性中我们可以设置任意的几何图形,注意是Geometry而非前面讲过的Shape,关于Geometry后面会专门讲到。如下面的例子,裁剪出一个椭圆的区域:
<CanvasBackground="#CDFCAE">
*{+v(i/G3M0<ImageSource="a1.png"Canvas.Left="40"Canvas.Top="80"></Image>ITPUB个人空间5Y'_3Y}!_+Bf(pH[
<ImageSource="a1.png"Canvas.Left="320"Canvas.Top="80">ITPUB个人空间"Sm'Nbefe
<Image.Clip>ITPUB个人空间9?(tq?'[1Y.Tywh
<EllipseGeometryCenter="120,68"RadiusX="100"RadiusY="60">
;zq^PRvLyP7gz0</EllipseGeometry>ITPUB个人空间Q0}8i)gj
LJ
</Image.Clip>
,p!C7Z`;o0</Image>
b&AB)nRj)BU0</Canvas>
运行后效果如下所示:ITPUB个人空间5FE9~C*}1T
Os
ITPUB个人空间"d _8on"d
R0R|3YF9a+^x[0
半透明遮罩
使用图片的OpacityMask属性,可以解释为通过用OpacityMask属性指定的画刷的alpha通道值来遮掩图片的alpha通道值,
可以使用的画刷有LinearGradientBrush,
RadialGradientBrush和ImageBrush,而对于SolidColorBrush则可以直接通过Opacity属性实现。如下面的
例子,我们对图片做一些渐变的效果:
<CanvasBackground="#CDFCAE">
yQ*s3~_ A K0<ImageSource="a1.png"Canvas.Left="160"Canvas.Top="80"Opacity="0.7">
5xxS2_'a;VD0<Image.OpacityMask>ITPUB个人空间+sI2dok{0j4`Af%p
<LinearGradientBrushStartPoint="0,0"EndPoint="1,0">
j8vXs:P#L.s[K0<GradientStopOffset="0.0"Color="#00000000" />
|S
AmM"F4dh}t0<GradientStopOffset="1.0"Color="#FF000000" />ITPUB个人空间
K)`;cRneC
</LinearGradientBrush>ITPUB个人空间$cH7E"TXa
y
</Image.OpacityMask>
&yl;ly4a5x*Wu0</Image>
vh.UnW
fM {D+R0</Canvas>
运行后效果如下:ITPUB个人空间2p!z|E8ePRd
ITPUB个人空间"t^5` s)c2B y
结束语
本文介绍了Silverlight中对于图片的处理,在后面我们还将利用这些知识做一个综合实例——实现图片的倒影效果。
ITPUB个人空间 mbNP1FC