一步一步学Silverlight 2系列(31):图形图像综合实例—实现水中倒影效果

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight 2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发。

本文将综合前面几篇关于图形图像处理的技术,如画刷、半透明遮罩、Transform等,实现一个水中倒影效果的示例。

Step 1:素材准备

最终我们实现的效果图将会如下所示:

 TerryLee_Silverlight2_0155

先准备一张图片,这里我使用了一张液晶显示器的图片:)

TerryLee_Silverlight2_0154

Step 2:创建图片

首先我们创建一个图片,使用Image控件,并进行定位

<Canvas Background="#000000">
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png">
    </Image>
</Canvas>

运行后应该看起来如下所示:

TerryLee_Silverlight2_0156 

Step 3:创建倒影

复制一张图片,使其位置与原始图片一样,然后我们使用ScaleTransform进行创建图片的倒影,这时图片已经翻转到了屏幕的外面,可以通过调节Canvas.Top进行调节,或者使用TranslateTransform:

<Canvas Background="#000000">
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png">
    </Image>
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png" Opacity="0.4">
        <Image.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleY="-1"></ScaleTransform>
                <TranslateTransform Y="320"></TranslateTransform>
            </TransformGroup>
        </Image.RenderTransform>
    </Image>
</Canvas>

运行后看起来如下所示:

 TerryLee_Silverlight2_0157

Step 4:半透明遮罩

利用我们在图片处理一文介绍过的OpacityMask属性实现半透明遮罩,使其看起来更加像倒影:)

<Canvas Background="#000000">
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png">
    </Image>
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png">
        <Image.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleY="-1"></ScaleTransform>
                <TranslateTransform Y="320"></TranslateTransform>
            </TransformGroup>
        </Image.RenderTransform>
        <Image.OpacityMask>
            <LinearGradientBrush StartPoint="0.5,1" EndPoint="0.5,0.0">
                <GradientStop Offset="0.0" Color="#00000000" />
                <GradientStop Offset="1.0" Color="#FF000000" />
            </LinearGradientBrush>
        </Image.OpacityMask>
    </Image>
</Canvas>

运行后效果如下,倒影图片显示出了淡出效果:

TerryLee_Silverlight2_0158  

Step 5:进一步扭曲倒影

我们对倒影图片做进一步的扭曲,用ScaleTransform来实现,使其在Y轴上做一些缩小,从1修改为0.75,达到扭曲的效果,并重新调整位置:

<Canvas Background="#000000">
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png">
    </Image>
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png">
        <Image.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleY="-0.75"></ScaleTransform>
                <TranslateTransform Y="280"></TranslateTransform>
            </TransformGroup>
        </Image.RenderTransform>
        <Image.OpacityMask>
            <LinearGradientBrush StartPoint="0.5,0.0" EndPoint="0.5,1.0">
                <GradientStop Offset="0.0" Color="#00000000" />
                <GradientStop Offset="1.0" Color="#FF000000" />
            </LinearGradientBrush>
        </Image.OpacityMask>
    </Image>
</Canvas>

运行后效果如下:

TerryLee_Silverlight2_0159

Step 6:斜化倒影

我们对倒影做进一步的斜化,而不是垂直倒影,使用SkewTransform来实现,并重新调整倒影位置:

<Canvas Background="#000000">
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png">
    </Image>
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png">
        <Image.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleY="-0.75"></ScaleTransform>
                <SkewTransform AngleX="-15"></SkewTransform>
                <TranslateTransform Y="280" X="-30"></TranslateTransform>
            </TransformGroup>
        </Image.RenderTransform>
        <Image.OpacityMask>
            <LinearGradientBrush StartPoint="0.5,0.0" EndPoint="0.5,1.0">
                <GradientStop Offset="0.0" Color="#00000000" />
                <GradientStop Offset="1.0" Color="#FF000000" />
            </LinearGradientBrush>
        </Image.OpacityMask>
    </Image>
</Canvas>

运行后效果应该如下所示:

TerryLee_Silverlight2_0161 

Step 7:进一步淡化倒影

为了使倒影更加逼真,我们最后再对倒影做点修饰,进一步淡化倒影,调整倒影的Opacity属性。

<Canvas Background="#000000">
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png">
    </Image>
    <Image Canvas.Top="20" Canvas.Left="182" Source="a.png" Opacity="0.4">
        <Image.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleY="-0.75"></ScaleTransform>
                <SkewTransform AngleX="-15"></SkewTransform>
                <TranslateTransform Y="280" X="-30"></TranslateTransform>
            </TransformGroup>
        </Image.RenderTransform>
        <Image.OpacityMask>
            <LinearGradientBrush StartPoint="0.5,0.0" EndPoint="0.5,1.0">
                <GradientStop Offset="0.0" Color="#00000000" />
                <GradientStop Offset="1.0" Color="#FF000000" />
            </LinearGradientBrush>
        </Image.OpacityMask>
    </Image>
</Canvas>

最后运行后整体效果如下所示:

TerryLee_Silverlight2_0155 

这样就完成了一个水中倒影的示例,大家可以充分发挥自己的创意,做出更炫更酷的效果。

结束语

本文综合运用前面几篇关于图形图像处理的技术,包括画刷、半透明遮罩、以及几种基本的Transform做了一个简单的水中倒影示例,你可以从这里下载本文示例代码。

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

  回复  引用  查看    
#1楼 2008-03-20 18:52 | 老钱      
高手,没时间学啊,
  回复  引用    
#2楼 2008-03-20 19:06 | studyBie [未注册用户]
想问一下楼主,silverlight 2 beta1 中如何使用 InkCanvas ? 找不参考,要加载哪个命名空间呢? 记得 silverlight 1.0 的时候还可以用的
  回复  引用    
#3楼 2008-03-20 19:15 | huson [未注册用户]
貌似搂主的倒影不符合物理规律?赫赫
  回复  引用  查看    
#4楼 [楼主]2008-03-20 19:19 | TerryLee      
@老钱
:)
  回复  引用  查看    
#5楼 [楼主]2008-03-20 19:20 | TerryLee      
@huson
很有可能,我总觉的倒影那儿有点问题,不过主要演示一些技术的使用,具体实现就靠大家的创意了。

// 已经更新了,这下应该符合物理规律了:)
  回复  引用  查看    
#6楼 [楼主]2008-03-20 19:20 | TerryLee      
@studyBie
在2.0中没看到这玩意儿啊,我回头找找看
  回复  引用  查看    
#7楼 2008-03-20 19:34 | Leepy      
先大概浏览一下您的Silverlight系列文章,确实很不错!
有时间再仔细学习下!
  回复  引用  查看    
#8楼 2008-03-20 20:04 | 二手的程序员      
是否可以象Flash 一样将SL生成一个EXE文件,这样就可以使C#程序脱离.net framework 运行了

  回复  引用  查看    
#9楼 [楼主]2008-03-20 20:11 | TerryLee      
@Leepy
:)
  回复  引用  查看    
#10楼 [楼主]2008-03-20 20:12 | TerryLee      
@二手的程序员
Silverlight生成的是.xap文件,可以在不安装.NET Framework的机器上运行
  回复  引用  查看    
#11楼 2008-03-20 20:16 | 生鱼片      
支持
  回复  引用    
#12楼 2008-03-20 20:29 | WASPCN [未注册用户]
Step 3:创建倒影 有点问题,应该这样:

<Image Canvas.Top="200" Canvas.Left="182" Source="a.png">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleY="-1"/>
</TransformGroup>
</Image.RenderTransform>
</Image>
  回复  引用  查看    
#13楼 2008-03-20 20:31 | 二手的程序员      
@TerryLee
xap 可以在装有sliverlight 控件的机器中直接运行吗?
我是想问一下,slilverlight 如何脱离web作为一个应用程序运行.
  回复  引用  查看    
#14楼 [楼主]2008-03-20 20:38 | TerryLee      
@生鱼片
:)
  回复  引用  查看    
#15楼 [楼主]2008-03-20 20:39 | TerryLee      
@WASPCN
嗯,用ScaleTransform实现就对了,我用RotateTransform完成后,才发现倒影有点问题,呵呵:)
  回复  引用  查看    
#16楼 [楼主]2008-03-20 20:40 | TerryLee      
@二手的程序员
Silverlight不能单独运行,需要有一个Web页面作为宿主
  回复  引用  查看    
#17楼 2008-03-20 20:44 | candylight      
接着学习,呵呵,谢谢TerryLee
  回复  引用  查看    
#18楼 2008-03-20 20:45 | 二手的程序员      
@TerryLee
flash 中的那个swf 不是可以单独运行吗,甚至还可以生成一个单独的exe,
从理论上讲Sliverlight应该能做到这一点吧,

  回复  引用    
#19楼 2008-03-20 20:56 | WASPCN [未注册用户]
Step 3:创建倒影 还是有点问题,应该这样:

<Image Canvas.Top="200" Canvas.Left="182" Source="a.png">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleY="-1"/>
<TranslateTransform Y="150"></TranslateTransform>
</TransformGroup>
</Image.RenderTransform>
</Image>


对了,如何知道a.png的高度?知道了话可以动态设置一下。




  回复  引用  查看    
#20楼 [楼主]2008-03-20 21:00 | TerryLee      
@WASPCN
谢谢,我刚才重新更新了一下,这下倒影应该对了,呵呵:)
  回复  引用  查看    
#21楼 [楼主]2008-03-20 21:01 | TerryLee      
@candylight
:)
  回复  引用  查看    
#22楼 [楼主]2008-03-20 21:01 | TerryLee      
@二手的程序员
事实上Silverlight 2目前好像还做不到这一点:)
  回复  引用  查看    
#23楼 2008-03-20 21:05 | 二手的程序员      
@TerryLee
谢谢
  回复  引用    
#24楼 2008-03-20 22:26 | WASPCN [未注册用户]
还是没有对!

应该是:

<Image Canvas.Top="200" Canvas.Left="182" Source="a.png">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleY="-1"/>
<TranslateTransform Y="320"></TranslateTransform>
</TransformGroup>
</Image.RenderTransform>
</Image>


  回复  引用  查看    
#25楼 [楼主]2008-03-20 22:34 | TerryLee      
@WASPCN
嗯,谢谢,已经更新:)

// 不用TranslateTransform,设置Canvas.Top属性也是可以的吧
  回复  引用  查看    
#26楼 [楼主]2008-03-20 22:35 | TerryLee      
@二手的程序员
别客气:)
  回复  引用  查看    
#27楼 2008-03-20 23:08 | WOW玩家      
老大,学Silverlight 2要安装什么东西,我已经安装了vs2008了
  回复  引用  查看    
#29楼 2008-03-21 08:00 | disgood      
呵呵,不错!不过图片的倒映上下好象是反了!
  回复  引用  查看    
#30楼 [楼主]2008-03-21 08:30 | TerryLee      
@disgood
嗯,确实有点问题,我晚上回家修改一下
  回复  引用    
#31楼 2008-03-21 10:14 | 菜鸟1只 [未注册用户]
越来越想跟着lz老大学slight了...象我做网站的 这个用起来肯定可以给网站增光添彩..老大千万别删掉这系列哦
  回复  引用    
#32楼 2008-03-21 10:51 | wildambition [未注册用户]
转换成wpf要依赖于.net框架,不转换依赖于浏览器的插件
  回复  引用    
#33楼 2008-03-21 16:40 | sd2208464 [未注册用户]
楼主发下如何将建立的这些工程应用到实际页面上,好吗?
比如在index.aspx中的某个部分显示相册。。。

实在不知道如何去做
  回复  引用  查看    
#34楼 [楼主]2008-03-21 22:11 | TerryLee      
@菜鸟1只
我不明白,这么辛苦写的文章怎么会删掉呢?
  回复  引用  查看    
#35楼 [楼主]2008-03-21 22:11 | TerryLee      
@wildambition
转换成WPF当然要.NET Framework了,WPF本身就是.NET Framework的一部分
  回复  引用  查看    
#36楼 [楼主]2008-03-21 22:13 | TerryLee      
@sd2208464
在页面哪个部分要用到,就把xap文件放到那个哪儿啊,参考本系列第一篇,这个问题好像不用再讲了吧?
  回复  引用  查看    
#37楼 2008-03-25 11:24 | 东吴居士      
你好,请教个问题.
如果图片和xaml不在一层目录下,无论怎么换图片的编译部署方式,运行的页面始终没有图片,但是design的时候是可以预览到的(预览到的前提是image source=图片名,只需要写图片名,不需要写相对路径,否则预览不到).
这个问题很困惑

  回复  引用  查看    
#38楼 [楼主]2008-03-25 22:19 | TerryLee      
@东吴居士
在别的文件夹下面没有试过,我测试一下吧。。。
  回复  引用  查看    
#39楼 2008-03-27 08:16 | disgood      
越来越感觉到 Selverlight的 优势,像TerryLee大哥学习,希望能够多出一些关于Selverlight新手入门的东西,再次感谢TerryLee大哥!
  回复  引用    
#40楼 2008-04-06 19:44 | 路过 [未注册用户]
TerryLee 大哥,真强~~
  回复  引用    
#41楼 2008-06-13 14:30 | Helloword [未注册用户]
我扭曲之后,图片找不到。。。
这样正常。
<TransformGroup>
<ScaleTransform ScaleY="-0.75"></ScaleTransform>
<TranslateTransform Y="280"></TranslateTransform>
</TransformGroup>

加上
<SkewTransform AngleX="-26"></SkewTransform>
倒影图片不见了。(我用的是 beat 2的)。
  回复  引用    
#42楼 2008-06-13 14:42 | Helloword [未注册用户]
找到原因了,它翻到上面去了,和第一个图重合了。重新设定第二个图片的相对于canvas的left和top就可以了。
:)
  回复  引用  查看    
#43楼 2008-06-24 11:50 | NMeteor      
學習了,感恩李老師。
  回复  引用  查看    
#44楼 2008-06-24 22:30 | Everett      
@TerryLee
看看这个,
网上忘了在哪找到的了
据说是sl的播放器,我也没试

WYMstyle - The free CSS framework
Copyright (C) 2006 Daniel Reszka

Licensed under the terms of the GNU Lesser General Public License:
http://www.opensource.org/licenses/lgpl-license.php

For further information visit:
http://www.wymstyle.org/
http://trac.wymstyle.org/


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-21 21:52 编辑过


相关链接: