一步一步学Silverlight 2系列(28):图片处理

概述

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格式的图片。

<Canvas Background="#CDFCAE">
    <Rectangle Canvas.Left="20" Canvas.Top="80"
               Width="240" Height="136" RadiusX="15" RadiusY="15">
        <Rectangle.Fill>
            <ImageBrush ImageSource="a1.png"></ImageBrush>
        </Rectangle.Fill>
    </Rectangle>
    
    <Image Source="b1.png" Canvas.Left="320" Canvas.Top="80"></Image>
</Canvas>

运行后如下所示:

TerryLee_Silverlight2_0137

图片拉伸

当我们创建了一个图片的时候,如果不指定它的宽度和高度,它将会使用默认的规格来显示;如果指定了高和宽,图片将显示在指定高和宽的矩形区域内。可以通过苏醒Stretch来指定图片如何填充在该区域内,即图片拉伸。Stretch属性具有四个可选值:

None:不对图片进行拉伸以便填充规定的尺寸。

Uniform:按比例进行拉伸,直到有一边满足规定的尺寸区域为止,其余部分不会被填充,按最小尺寸填充。

UniformToFill:按比例进行拉伸,直到完全填充规定的尺寸区域为止,超出该区域的将会被裁剪,按最大尺寸填充。

Fill:不按比例拉伸,完全填充规定的尺寸区域,将会破坏图像的比例。

Stretch默认的属性是Uniform,为了更直观的看到这个四个值的区别,下面看一个例子,我们使用一个规格尺寸为160*90图片,中间带一个小的正方形:

TerryLee_Silverlight2_0138

在页面上放置四个Border控件,大小为220*220,并在其中各放置一个Image,图片的大小也定义为220*220,设置四个Image的Stretch属性分别为None、Uniform、UniformToFill、Fill,如下所示:

<Canvas Background="#CDFCAE">
    <Border BorderBrush="Black" BorderThickness="3"
            Width="220" Height="220" Canvas.Left="40" Canvas.Top="50">
        <Image Source="a2.png" Stretch="None" Width="220" Height="220"></Image>
    </Border>
    
    <Border BorderBrush="Black" BorderThickness="3"
            Width="220" Height="220" Canvas.Left="330" Canvas.Top="50">
        <Image Source="a2.png" Stretch="Uniform" Width="220" Height="220"></Image>
    </Border>

    <Border BorderBrush="Black" BorderThickness="3"
            Width="220" Height="220" Canvas.Left="330" Canvas.Top="330">
        <Image Source="a2.png" Stretch="UniformToFill" Width="220" Height="220"></Image>
    </Border>
    
    <Border BorderBrush="Black" BorderThickness="3"
            Width="220" Height="220" Canvas.Left="40" Canvas.Top="330">
        <Image Source="a2.png" Stretch="Fill" Width="220" Height="220"></Image>
    </Border>
</Canvas>

运行后可以很明显的看到这个四个值的区别,如下图所示:

TerryLee_Silverlight2_0139

裁剪图片

有时候我们只需要显示出图片的一部分,可以使用Clip属性对图片进行裁剪,在Clip属性中我们可以设置任意的几何图形,注意是Geometry而非前面讲过的Shape,关于Geometry后面会专门讲到。如下面的例子,裁剪出一个椭圆的区域:

<Canvas Background="#CDFCAE">
    <Image Source="a1.png" Canvas.Left="40" Canvas.Top="80"></Image>
    <Image Source="a1.png" Canvas.Left="320" Canvas.Top="80">
        <Image.Clip>
            <EllipseGeometry Center="120,68" RadiusX="100" RadiusY="60">
            </EllipseGeometry>
        </Image.Clip>
    </Image>
</Canvas>

运行后效果如下所示:

TerryLee_Silverlight2_0140

半透明遮罩

使用图片的OpacityMask属性,可以解释为通过用OpacityMask属性指定的画刷的alpha通道值来遮掩图片的alpha通道值,可以使用的画刷有LinearGradientBrush, RadialGradientBrush和ImageBrush,而对于SolidColorBrush则可以直接通过Opacity属性实现。如下面的例子,我们对图片做一些渐变的效果:

<Canvas Background="#CDFCAE">
    <Image Source="a1.png" Canvas.Left="160" Canvas.Top="80" Opacity="0.7">
        <Image.OpacityMask>
            <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
                <GradientStop Offset="0.0" Color="#00000000" />
                <GradientStop Offset="1.0" Color="#FF000000" />
            </LinearGradientBrush>
        </Image.OpacityMask>
    </Image>
</Canvas>

运行后效果如下:

TerryLee_Silverlight2_0141 

结束语

本文介绍了Silverlight中对于图片的处理,在后面我们还将利用这些知识做一个综合实例——实现图片的倒影效果。

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: Silverlight
posted @ 2008-03-18 20:11 TerryLee 阅读(10958) 评论(54)  编辑 收藏 所属分类: [03]  银光点亮世界

  回复  引用  查看    
#1楼[楼主]2008-03-18 20:21 | TerryLee      
本文的内容也是比较简单,在1.0时代就已经有了,就当复习一遍吧:)
  回复  引用  查看    
#2楼2008-03-18 20:29 | candylight      
你出一个,我学一个。楼主的例子比Scott的那个digg的例子好多了,那个例子做到第三章还是第四章就出错做不下去了。
不过比较奇怪的是,TerryLee你的silverlight素材和知识是从哪里来的呢?现在能看到的资料不多呀了,另外,测试了一下例子,silverlight 2.0中除了png,jpg也是支持的,不过bmp和gif都不行。

  回复  引用  查看    
#3楼2008-03-18 20:47 | Lostway(七月)      
--引用--------------------------------------------------
candylight: 你出一个,我学一个。不过比较奇怪的是,TerryLee你的silverlight素材是从哪里来的呢?现在能看到的资料不多呀
--------------------------------------------------------

是的,我也觉得很奇怪,这一系列的教程我一直都在学习。

  回复  引用  查看    
#4楼2008-03-18 20:49 | chegan      
搂主真厉害,写得比我看得都快
  回复  引用    
#5楼2008-03-18 21:06 | allentranks[未注册用户]
re
我也是这么想的~
对于多产的人一概仰慕之(权当是交学费啦!^_^)

--引用--------------------------------------------------
chegan: 搂主真厉害,写得比我看得都快
--------------------------------------------------------

  回复  引用  查看    
#6楼[楼主]2008-03-18 21:08 | TerryLee      
@candylight
现在主要看SDK,还有自己多做一些Demo

晕倒,我这儿jpg格式居然出不来,不知道怎么回事:)

  回复  引用  查看    
#7楼[楼主]2008-03-18 21:09 | TerryLee      
@Lostway(七月)
最好的资料就是SDK了,平时看看Silverlight官方网站,呵呵

  回复  引用  查看    
#8楼[楼主]2008-03-18 21:09 | TerryLee      
@chegan
呵呵,谢谢支持:)

  回复  引用  查看    
#9楼[楼主]2008-03-18 21:09 | TerryLee      
@allentranks
谢谢啊:)

  回复  引用    
#10楼2008-03-18 21:10 | ooooo5[未注册用户]
@allentranks

tanke..你还是bbs的老习惯啊,,把回复放引用上面。。。

  回复  引用  查看    
#11楼[楼主]2008-03-18 21:40 | TerryLee      
@ooooo5
:)

  回复  引用  查看    
#12楼2008-03-18 22:12 | 生鱼片      
28了,支持
  回复  引用  查看    
#13楼[楼主]2008-03-18 22:16 | TerryLee      
@生鱼片
呵呵,多谢支持:)

  回复  引用  查看    
#14楼2008-03-18 22:55 | jillzhang      
非常帅,多谢分享

  回复  引用  查看    
#15楼[楼主]2008-03-18 23:02 | TerryLee      
@jillzhang
多谢老张支持,呵呵:)

  回复  引用    
#16楼2008-03-18 23:33 | 盛大[未注册用户]
厉害啊。兄弟。我是菜鸟。支持下你。希望以后有更多的好教程
  回复  引用  查看    
#17楼[楼主]2008-03-18 23:55 | TerryLee      
@盛大
谢谢:)

  回复  引用  查看    
#18楼2008-03-19 09:00 | <∩扫地僧∩>      
最后处理好的这个图片效果能不能保存成图片啊?
  回复  引用  查看    
#19楼[楼主]2008-03-19 09:07 | TerryLee      
@&lt;∩扫地僧∩&gt;
截屏吧:)

但是截屏还不如直接在Photoshop中处理一下渐变。。。

直接保存似乎没有什么方法

  回复  引用    
#20楼2008-03-19 09:25 | GoneSky[未注册用户]
博主真是厉害啊。
能否讲讲storyborad Class呢?我看了2008的msdn,里面给出的很多代码竟然没法实现,我都郁闷死了。

  回复  引用  查看    
#21楼2008-03-19 09:42 | 笑煞天      
阁下发贴的速度真是让人叹为观止哈.
  回复  引用  查看    
#22楼[楼主]2008-03-19 09:59 | TerryLee      
@GoneSky
Storyborad在动画部分中将会详细讲解:)

  回复  引用  查看    
#23楼[楼主]2008-03-19 10:00 | TerryLee      
@笑煞天
呵呵,谢谢:)

  回复  引用  查看    
#24楼2008-03-19 10:01 | Clark Zheng      
我的天呀,都到28啦,可以出本书了。。。
  回复  引用  查看    
#25楼[楼主]2008-03-19 10:12 | TerryLee      
@Clark Zheng
呵呵,现在还没有出书的打算,等认识更深一些再说吧:)

  回复  引用  查看    
#26楼2008-03-19 10:26 | Clark Zheng      
@TerryLee
看样子是打算出手必经典啦

  回复  引用  查看    
#27楼[楼主]2008-03-19 11:02 | TerryLee      
@Clark Zheng
:)

  回复  引用    
#28楼2008-03-19 11:54 | fd[未注册用户]
fdsfdsf
  回复  引用    
#29楼2008-03-19 11:56 | Aiouluosi[未注册用户]
朋友,可以发下代码吗?我在学习它...
http://aiouluosi.cnblogs.com

  回复  引用  查看    
#30楼[楼主]2008-03-19 12:57 | TerryLee      
@fd

  回复  引用  查看    
#31楼[楼主]2008-03-19 12:57 | TerryLee      
@Aiouluosi
代码比较简单,文章中都已经全部贴出来了:)

  回复  引用    
#32楼2008-03-19 17:03 | soief[未注册用户]
朋友,能告诉我安装完visual studio2008以后再安装什么才能使用silverlight
  回复  引用  查看    
#34楼2008-03-21 09:30 | 张荣华      
@TeeryLee
JPG格式是可以的,我这里应用没有问题。

  回复  引用  查看    
#35楼[楼主]2008-03-21 22:10 | TerryLee      
@张荣华
那就不知道为什么了,我这儿只有.png格式的可以:)

  回复  引用    
#36楼2008-09-16 15:26 | TooOK.com[未注册用户]
very good
  回复  引用  查看    
#37楼[楼主]2008-09-17 00:51 | TerryLee      
@TooOK.com
:-)

  回复  引用    
#38楼2008-10-21 09:20 | ka[未注册用户]
支持一下,写这么多真不容易。
现在网上找Silverlight的资料很不容易呀。。

  回复  引用  查看    
#39楼[楼主]2008-10-24 10:18 | TerryLee      
@ka
谢谢支持:)

  回复  引用    
#40楼2008-10-24 14:58 | liaohenchen[未注册用户]
Lee,我向请问一下,如果要做两张图片或者多张图片的合成,应该怎么做呢?

  回复  引用  查看    
#41楼[楼主]2008-10-25 10:17 | TerryLee      
@liaohenchen
那要看你想要的合成的效果了,如果只是想简单的把几张图片连接起来,是可以实现的;如果想要实现非常复杂的效果,在Silverlight里面有些难度,你可以参考一下园子里老张的一个开源项目GifLib。

  回复  引用    
#42楼2008-10-27 11:25 | liaohenchen[未注册用户]
@TerryLee
如果是做图片水印效果呢,只不过需要控制显示的位置
我看过用wpf开发的一个例子,但sl中好像有些功能没有(就是有些方法在wpf中有,在sl中没有),我不知道该怎么办了?
再次感谢!

  回复  引用  查看    
#43楼[楼主]2008-10-28 10:11 | TerryLee      
@liaohenchen
WPF中有的功能在Silverlight中没有,很正常,毕竟Silverlight还只是是WPF的一个子集:)

  回复  引用    
#44楼2008-10-28 10:50 | liaohenchen[未注册用户]
@TerryLee
哎,那我就只有想象其他办法咯^_^

  回复  引用    
#45楼2009-02-02 18:13 | 洛楽樂[未注册用户]
我想问个问题,这里讲到拉伸,那么是如何做到图片重复的平铺于整个窗口,并且适应窗口大小的?
  回复  引用    
#47楼2009-02-24 14:55 | 季风[未注册用户]
请问,Image控件的source属性的路径是否只能是全段域名,我试了~,和两点,始终不能显示图片,打上完整的域名才能显示?



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1112037




相关文章:

相关链接: