您的位置:首页 > 其它

Windows Phone 资源图片使用(2)

2012-05-29 10:36 281 查看
1.4 限制图片大小

受限于手机有限存储(WP7上一个应用程序可使用的内存不能超过90M,否则程序会自动退出并且不报任何异常信息)和屏幕分辨率,另一个优化性能的方法是限制图片大小在2000*2000以内,这也是WP7环境下图片的大小上限。更大的图片应在低分辨率下取样后再显示,如果图片大于2000*2000其显示会明显减慢。

如果必须使用2000*2000以上的图片,那么应该每次只显示图片的一部分。你可以通过先将图片载入到一个T:System.Windows.Media.Imaging.WriteableBitmap中,然后使用LoadJpeg(WriteableBitmap, Stream)扩展方法来载入图片。以下代码示范了载入大图片的推荐方法。

XAML代码

<Grid x:Name="ContentGrid" Grid.Row="1">

<Image Height="3000" HorizontalAlignment="Left" Margin="6,6,0,0" Name="largeimage" Stretch="Fill" VerticalAlignment="Top" Width="3000" />

<Button Content="加载图片" Height="70" HorizontalAlignment="Left" Margin="159,501,0,0" Name="btnLoad" VerticalAlignment="Top" Width="152" Click="btnLoad_Click" />

</Grid>

复制代码
C#代码

/// <summary>

/// 加载图片

/// </summary>

private void btnLoad_Click(object sender, RoutedEventArgs e)

{

StreamResourceInfo sri = null;

Uri uri = new Uri("Devdiv_LoadingLargeImages;component/img/sky.JPG", UriKind.Relative);

sri = Application.GetResourceStream(uri);

WriteableBitmap wb = new WriteableBitmap((int)this.largeimage.Width, (int)this.largeimage.Height);

Extensions.LoadJpeg(wb, sri.Stream);

this.largeimage.Source = wb;

}

复制代码
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)扩展方法来载入大图片,前面已经说到。



2012-3-2 10:23:10 上传
下载附件
(72.29 KB)

BuildAction选项设置

1.6 删除对象节约内存

WP7上一个应用程序可使用的内存不能超过90M,否则程序会自动退出并且不报任何异常信息。

同时,WP7上使用image会占用大量内存,不论是在UI上添加Image控件还是为Panorama控件设置图像背景。 因此,为了节约内存,可以在需要的时候手动释放不再需要的Image控件,如果你觉得垃圾收集不好用的话。

下面三种方法都能释放内存,但是第一种方法并没有完全释放,还保存了几十K的信息,估计是用于恢复图像显示的。

1.Image_Logo.Visibility = System.Windows.Visibility.Collapsed;

2.LayoutRoot.Children.Remove(Image_Logo);

3.Image_Logo.Source = null;

复制代码
注意:如果Image是在XAML文件里定义的,则用上述方法是不起作用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: