选择图像后出现内存不足

时间:2014-03-19 14:06:14

标签: c# xaml windows-phone-8 windows-phone

我希望用户显示所选图像的列表:

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张图像后,app会达到内存限制并退出。我只是想显示那些选定图像的缩略图,比如PhotoHub,如何在不消耗大量内存的情况下做到这一点?感谢

1 个答案:

答案 0 :(得分:1)

正如评论中提到的,有几种方法可以解决它,正如你所提到的,你可能需要一个缩略图。以下是我现在可以想到的一些方法,可以解决你的记忆问题:

方法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
    }
}

要实现此功能,您还需要在ID_CAP_MEDIALIB_PHOTO中启用功能WMAppManifest.xml,否则您将无法获得任何结果。

方法2:

第二种选择是使用例如WriteableBitmapEx library来自己创建缩略图,类似于:

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
    }
}

其他方法:

另一个解决方案可能是使用Nokia Imaging SDK,根据文档支持部分JPEG解码(我自己也没有使用过这个SDK,所以现在不能给你任何示例代码) :

  

使用RAJPEG技术,无需解码整体即可访问图像数据   JPEG图像,用于快速预览,效果应用,   旋转和裁剪高分辨率图像。