Windows Phone 资源图片使用(2)

1.4 限制图片大小
受限于手机有限存储(WP7上一个应用程序可使用的内存不能超过90M,否则程序会自动退出并且不报任何异常信息)和屏幕分辨率,另一个优化性能的方法是限制图片大小在2000*2000以内,这也是WP7环境下图片的大小上限。更大的图片应在低分辨率下取样后再显示,如果图片大于2000*2000其显示会明显减慢。
如果必须使用2000*2000以上的图片,那么应该每次只显示图片的一部分。你可以通过先将图片载入到一个T:System.Windows.Media.Imaging.WriteableBitmap中,然后使用LoadJpeg(WriteableBitmap, Stream)扩展方法来载入图片。以下代码示范了载入大图片的推荐方法。
XAML代码
  1. <Grid x:Name="ContentGrid" Grid.Row="1">
  2. <Image Height="3000" HorizontalAlignment="Left" Margin="6,6,0,0" Name="largeimage" Stretch="Fill" VerticalAlignment="Top" Width="3000" />
  3. <Button Content="加载图片" Height="70" HorizontalAlignment="Left" Margin="159,501,0,0" Name="btnLoad" VerticalAlignment="Top" Width="152" Click="btnLoad_Click" />
  4. </Grid>
复制代码
C#代码
  1. /// <summary>
  2. /// 加载图片
  3. /// </summary>
  4. private void btnLoad_Click(object sender, RoutedEventArgs e)
  5. {
  6. StreamResourceInfo sri = null;
  7. Uri uri = new Uri("Devdiv_LoadingLargeImages;component/img/sky.JPG", UriKind.Relative);
  8. sri = Application.GetResourceStream(uri);

  9. WriteableBitmap wb = new WriteableBitmap((int)this.largeimage.Width, (int)this.largeimage.Height);
  10. Extensions.LoadJpeg(wb, sri.Stream);

  11. this.largeimage.Source = wb;
  12. }
复制代码
1.5 BuildAction选择“Content”还是“Resource”
有时候在你的程序中会附带一些图片、音乐、视频文件等等,这些文件的BuildAction可以设置为“Content”然后作为独立大的文件来访问,也可以设置为“Resource”把它们作为资源文件读取。那么哪种方式好呢?
微软给出的建议是使用”Content”要比“Resource”性能上好一些。因为Windows Phone 7是为文件和网络流做了优化处理,但是Memory流却没有。设置成Content类型,这些文件将会作为独立的文件存在XAP包中,如果设置为Resource,它们会被编译到dll中,如果把这些文件设置为Resource方式的话,它们实际上在回放的时候还需要读取出来放到文件中,反而降低了性能。所以,如果你的程序中有大量的媒体文件的话,要想性能好,还是把它们的BuildAction设置为“Content”比较好一些。大文件建议吧BuildAction设置为“Resource”,借助LoadJpeg(WriteableBitmap, Stream)扩展方法来载入大图片,前面已经说到。

图片资源.jpg
2012-3-2 10:23:10 上传
下载附件 (72.29 KB)

BuildAction选项设置

1.6 删除对象节约内存
WP7上一个应用程序可使用的内存不能超过90M,否则程序会自动退出并且不报任何异常信息。
同时,WP7上使用image会占用大量内存,不论是在UI上添加Image控件还是为Panorama控件设置图像背景。 因此,为了节约内存,可以在需要的时候手动释放不再需要的Image控件,如果你觉得垃圾收集不好用的话。

下面三种方法都能释放内存,但是第一种方法并没有完全释放,还保存了几十K的信息,估计是用于恢复图像显示的。
  1. 1.Image_Logo.Visibility = System.Windows.Visibility.Collapsed;
  2. 2.LayoutRoot.Children.Remove(Image_Logo);
  3. 3.Image_Logo.Source = null;
复制代码
注意:如果Image是在XAML文件里定义的,则用上述方法是不起作用的。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值