Silverlight支持两个格式的图片显示,它们是:JPEG和PNG,PNG使用的是无损压缩算法,可以准确重建原始位图;而JPEG使用的是一种有损压缩算法,这种算法会对齐人们肉眼不易察觉到的一些可视信息这种压缩方式对照片这样的图像非常有效,但是却不适用于文本或基于矢量派生的位图,如建筑图和动画。
1.Image元素
在Silveright中,Image元素用来显示位图,但是Image元素并不是位图本身。
下面是Image元素显示本地图片的xaml代码:
<Image Name="image1" Source="Images/Superman.jpg"/> //当中的Source属性指向要显示的图片
默认的情况,在保持正确的宽高比例的前提之下,Image元素会尽量放大或缩小以充满其容器(内容网格)。如果想要按原始像素尺寸显示图片的话,可以将Image的Stretch属性设置为None:
<Image Name="image1" Source="Images/Superman.jpg" Stretch="None" />
Image可以通过Web来获取图像,只需要将Image的Source属性设置为一个可用的URL即可,如下面的示例所示:
<Image Name="image1" Source="http://images.cnblogs.com/cnblogs_com/IPrograming/353645/o_sammy-2-anos.jpg" />
这样Image元素就可以根据给定的URL从Web中下载图片并显示,这样就能够控制可执行文件的大小,但是考虑到Windows Phone设备并不总是与Web连接,并且在图片下载过程中还可能遇到其他的问题。为了处理这种情况,我们可以根据Image元素的两个事件:ImageFailed(出现错误后发生)和ImageOpened(下载成功后发生),根据这两个事件来判断下载是否成功,从而使程序根据不同的情况作出相应的选择。
2.ImageSource
Object
DependencyObject(抽象)
ImageSource(抽象)
BitmapSource(抽象)
BitmapImage
WriteableBitmap
ImageSource是一个抽象类,派生了BitmapSource,BitmapSource类型是另一个抽象类,他定义了一个名为SetSource的方法,该方法可以通过Stream对象加载图像。派生自BitmapSource的BitmapImage支持一个可接收Uri对象的构造函数,包括一个Uri类型的UriSource属性。
加载本地位图并显示到一个Image元素中:
Uri uri = new Uri("/SilverlightTapToDownload;component/Images/Superman.jpg",UriKind.Relative); //当生成操作为Resource时URL显得比较复杂,先是以程序名称开头,然后分号,接着单词component,最后是文件夹和文件名。如果把图片属性的生成操作(Build Action)改为内容(Content)而不是Resource时,语法可以这样简写:
Uri uri = new Uri("Images/Superman.jpg", UriKind.Relative);
//两者之间有何不同呢?
//两种情况下,位图都存储在xap文件中的某一个目录下。区别在于:
//当Bulid Action为Resource时,位图与编译后的程序一同储存在SilverlightTapToDownload.dll文件中
//当Build Action为Content时,位图储存在SilverlightTapToDownload.dll文件的外部
StreamResourceInfo resourceInfo = Application.GetResourceStream(uri);
BitmapImage bmp = new BitmapImage();
bmp.SetSource(resourceInfo.Stream);
image1.Source = bmp; //image1是一个Image元素
从网络上下载一张图片并显示到一个Image元素中:
Uri uri = new Uri("http://images.cnblogs.com/cnblogs_com/IPrograming/353645/o_sammy-2-anos.jpg");
BitmapImage bmp = new BitmapImage(uri);
image1.Source = bmp; //image1是一个Image元素