艾伟:Silverlight 3 Beta 新特性解析(2)-Graphics篇

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 前提条件:阅读本文之前请确认你已经安装了如下软件Visual Studio 2008 (Express) SP1 Silverlight 3 Tools For Visual Studio Microsoft Expression Blend 3 MIX 09 Preview  ...

前提条件:

阅读本文之前请确认你已经安装了如下软件

 

本篇主要内容:

  • 如何利用新的Bitmap API来创建我们自己的图像
  • 透视3D图像(Perspective 3D Graphic)
  • 像素模糊和投影效果
  • Element-To-Element Binding

Bitmap API的写图像功能:

新版的Bitmap API支持从写每个像素的值来创建自己的图像

这个用来支持生成Bitmap的类叫做WriteableBitmap,继承自BitmapSource类

这个类位于System.Windows.Media.Imaging名字空间中,其函数成员包括

   1: public sealed class WriteableBitmap : BitmapSource
   2: {
   3:     public WriteableBitmap(BitmapSource source);
   4:     public WriteableBitmap(int pixelWidth, int pixelHeight, PixelFormat format);
   5:     public int this[int index] { get; set; }
   6:     public void Invalidate();
   7:     public void Lock();
   8:     public void Render(UIElement element, Transform transform);
   9:     public void Unlock();
  10: }

从上图可以看出我们可以通过两种形式来实例化这个WriteableBitmap

一个是通过传入已经初始化了的BitmapSource

另外一个是通过输入图像高度和宽度以及像素类型(有Bgr32和Pbgra32两种,后面一种可以创建半透明图像)

第5行的索引this[int index]可以用来读或取像素点

写一个WriteableBitmap的流程是这样的

  1. 实例化WriteableBitmap
  2. 调用Lock方法
  3. 写像素点
  4. 调用Invalidate方法
  5. 最后是调用Unlock方式来释放所有的Buffer并准备显示

如下文所示以描点的方式构建了整个Bgr32图像

   1: private WriteableBitmap BuildTheImage(int width, int height)
   2: {
   3:     WriteableBitmap wBitmap=new WriteableBitmap(width,height,PixelFormats.Bgr32);
   4:     wBitmap.Lock();
   5:  
   6:     for (int x = 0; x < width; x++)
   7:     {
   8:         for (int y = 0; y < height; y++)
   9:         {
  10:             byte[] brg = new byte[4];
  11:             brg[0]=(byte)(Math.Pow(x,2) % 255);   //Blue, B
  12:             brg[1] = (byte)(Math.Pow(y,2) % 255); //Green, G
  13:             brg[2] = (byte)((Math.Pow(x, 2) + Math.Pow(y, 2)) % 255); //Red, R
  14:             brg[3] = 0;
  15:  
  16:             int pixel = BitConverter.ToInt32(brg, 0);
  17:  
  18:             wBitmap[y * height + x] = pixel;
  19:         }
  20:     }
  21:  
  22:     wBitmap.Invalidate();
  23:     wBitmap.Unlock();
  24:  
  25:     return wBitmap;
  26: }

画出来的图像如下图所示

SL3Beta_Graphic01

很神奇的一个改进。有了这个类,我们就可以操纵像素点了

在微软上对图像处理做些应用,比如去红点等功能

透视3D效果

所有继承自System.Windows.UIElement的类都将含有Projection这个属性

也就是说我们看到的所有控件都将具有3D功能

你可以通过沿X轴,Y轴或者Z轴旋转任意角度来获得3D效果

SL3Beta_Graphic02

如将上面生成的图片沿X轴旋转-20度,我们可以得到

SL3Beta_Graphic03

其默认的旋转轴心是CenterOfRotationX=0.5,CenterOfRotationY=0.5,CenterOfRotationZ=0

上面的旋转代码如下:

   1: "Img">
   2:     
   3:         "ImageProjection" RotationX="-20"/>
   4:     
   5: 

其他空间的3D平面投影与此类似

像素模糊和投影效果

与Projection一样,Effect属性也是在System.Windows.UIElement

所以所有的Toolbar中的控件都支持像素模糊和投影效果

模糊和投影效果(BlurEffect and DropShadowEffect)都在System.Windows.Media.Effects这个名字空间中

SL3Beta_Graphic04 SL3Beta_Graphic05

整个控件模糊效果的程度由Radius来控制,其默认值为5,Radius越大,应用了BlurEffect的控件越模糊

SL3Beta_Graphic06

代码如下:

   1: 
   2:     
   3:         "20"/>
   4:     
   5: 

投影效果的参数比模糊效果复杂些

共有5个属性来控制投影效果

BlurRadius用来控制控件边缘的模糊度,值越大边缘越模糊,默认值仍然是5

Color属性用来设置投影的颜色,默认颜色是黑色

Direction属性用来控制投影方向,值为0时代表投影到控件的正右方,以逆时针的形式来增大投影角度

       默认值为315,值的范围只能在0~360之间

Opacity属性用来控制边缘的透明度,其使用而控件的Opacity属性一样

ShadowDepth属性用来设置投影平面和控件平面的垂直距离,默认值为5,其值范围为0~300

SL3Beta_Graphic07

其代码如下:

   1: 
   2:     
   3:         "5" Color="White" Opacity="0.7" ShadowDepth="7"/>
   4:     
   5: 

Element-To-Element Binding:

元素和元素之间的属性绑定是首先在WPF中实现的

现在Silverlight 3终于把这个实用的功能引入了

绑定的格式如:{Binding 属性名,Mode=绑定模式,ElementName=绑定元素}

其中绑定元素就是你先绑定的元素的名字,属性名是你想绑定的元素的属性名(这样将把被绑定的元素的绑定属性的值绑定给新元素的属性)

最后绑定模式有两种:OneWay和TwoWay,TwoWay表示有一方的绑定属性的值改变了,两边的值都同步更新

而OneWay表现只在被绑定元素的属性值改变后,绑定元素的属性值才改变,而反之不成立

如下代码:

   1: "400" Height="400" x:Name="Img">
   2:     
   3:         "ImageProjection"/>
   4:     
   5: 
   6: "PlotX" Minimum="-90" Maximum="90" Value="{Binding RotationX, Mode=TwoWay, ElementName=ImageProjection}"/>
   7: "PlotY" Minimum="-90" Maximum="90" Value="{Binding RotationY, Mode=TwoWay, ElementName=ImageProjection}"/>
   8: "PlotZ" Minimum="-90" Maximum="90" Value="{Binding RotationZ, Mode=TwoWay, ElementName=ImageProjection}"/>

是用了三个Slider来绑定控制Image的3D效果,效果图如下

SL3Beta_Graphic08

代码下载:

 

 

作者:ibillguo
出处:http://ibillguo.cnblogs.com/
本文版权由作者和博客园共同所有,转载请注明出处
目录
相关文章
|
3月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
56 3
|
3月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
74 3
|
3月前
|
缓存 JavaScript 前端开发
Vue3与Vue2生命周期对比:新特性解析与差异探讨
Vue3与Vue2生命周期对比:新特性解析与差异探讨
179 2
|
2月前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
65 7
C# 9.0 新特性解析
|
2月前
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
41 1
|
2月前
|
数据安全/隐私保护 iOS开发 开发者
iOS 14隐私保护新特性深度解析####
随着数字时代的到来,隐私保护已成为全球用户最为关注的问题之一。苹果在最新的iOS 14系统中引入了一系列创新功能,旨在增强用户的隐私和数据安全。本文将深入探讨iOS 14中的几大隐私保护新特性,包括App跟踪透明度、剪贴板访问通知和智能防追踪功能,分析这些功能如何提升用户隐私保护,并评估它们对开发者和用户体验的影响。 ####
|
2月前
|
PHP 开发者
PHP 7新特性深度解析
【10月更文挑战第40天】随着PHP 7的发布,这个广泛使用的语言带来了许多令人兴奋的新特性和性能改进。本文将深入探讨PHP 7的主要变化,包括类型声明、错误处理机制、性能优化等方面,帮助开发者更好地理解和应用这些新特性。
45 5
|
2月前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
49 2
|
2月前
|
PHP 开发者
PHP 7新特性深度解析及其最佳实践
【10月更文挑战第31天】本文将深入探讨PHP 7带来的革新,从性能提升到语法改进,再到错误处理机制的变革。我们将通过实际代码示例,展示如何高效利用这些新特性来编写更加健壮和高效的PHP应用。无论你是PHP新手还是资深开发者,这篇文章都将为你打开一扇窗,让你看到PHP 7的强大之处。
|
2月前
|
安全 编译器 PHP
PHP 8新特性解析与实践应用####
————探索PHP 8的创新功能及其在现代Web开发中的实际应用

热门文章

最新文章

推荐镜像

更多