选择图像后内存不足异常

本文关键字:异常 内存不足 图像 选择 | 更新日期: 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功能,否则您将无法获得任何结果。

方法2:

第二个选择是使用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图像快速预览,应用效果,高分辨率图像的旋转和裁剪。