选择图像后内存不足异常
本文关键字:异常 内存不足 图像 选择 | 更新日期: 2023-09-27 17:51:00
我想显示用户选择的图像列表:
void photoChooserTask_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
var fileName = e.OriginalFileName;
var photoStream = e.ChosenPhoto;
}
}
和
<Image Source="{Binding PhotoStream}" Width="200" Height="200"/>
问题是在选择4或5张图片后,应用程序达到内存限制并退出。我只想显示选中图像的缩略图,像PhotoHub那样,如何在不消耗大量内存的情况下做到这一点?由于
正如评论中提到的,有几种方法可以解决这个问题,正如您提到的,您可能需要一个缩略图。这里有一些我现在能想到的方法,可能会解决你的记忆问题:
方法1:首先使用MediaLibrary
找到相同的图像,在那里您将获得一个缩略图版本的流,如下所示:
void task_Completed(object sender, Microsoft.Phone.Tasks.PhotoResult e)
{
if (e.TaskResult == Microsoft.Phone.Tasks.TaskResult.OK)
{
MediaLibrary library = new MediaLibrary();
Picture pic = library.Pictures.Where(p => e.OriginalFileName.EndsWith("''" + p.Album.Name + "''" + p.Name)).FirstOrDefault();
Stream thumbnailStream = pic.GetThumbnail(); // Stream to a thumbnail
}
}
要使其工作,您还需要启用WMAppManifest.xml
中的ID_CAP_MEDIALIB_PHOTO
功能,否则您将无法获得任何结果。
第二个选择是使用WriteableBitmapEx库来创建一个缩略图,就像这样:
void task_Completed(object sender, Microsoft.Phone.Tasks.PhotoResult e)
{
if (e.TaskResult == Microsoft.Phone.Tasks.TaskResult.OK)
{
BitmapImage source = new BitmapImage();
source.SetSource(e.ChosenPhoto);
WriteableBitmap bitmap = new WriteableBitmap(source);
WriteableBitmap thumbnail = bitmap.Resize(100, 100, WriteableBitmapExtensions.Interpolation.Bilinear); // Creates a 100x100 thumbnail
}
}
其他方法:另一个解决方案可能是使用诺基亚成像SDK,根据文档支持部分JPEG解码(我自己没有使用这个SDK,所以现在不能给你任何示例代码):
采用RAJPEG技术,访问图像数据无需整体解码JPEG图像快速预览,应用效果,高分辨率图像的旋转和裁剪。