使用BitmapImage打开大型图像.SetSource -内存不足异常

本文关键字:SetSource 内存不足 异常 图像 大型 BitmapImage 使用 | 更新日期: 2023-09-27 18:13:45

我正在创建一个Silverlight 4应用程序,需要在将图像上传到服务器之前显示缩略图。我的代码对于15mb以下的图像非常有效,但当我尝试打开大型图像(一些超过30mb)时,我得到以下异常:

Insufficient memory to continue the execution of the program.

错误是不言自明的,但我的问题是....是否有其他方法可以打开大图像或增加Silverlight应用程序可用的内存?

我在一台有8gb内存的机器上测试这个,当我检查IE进程托管的应用程序内存使用在抛出异常之前达到峰值约250mb,所以假设我的机器没有耗尽内存是相当安全的。

我用来打开完整图像的代码如下,尽管我省略了生成调整大小的缩略图的代码,因为它目前从来没有得到那么远的大图像:

private BitmapImage OpenImage(Stream stream)
{
     byte[] fullRead = this.ReadFully(stream);
     MemoryStream ms = new MemoryStream(fullRead);
     BitmapImage bi = new BitmapImage();
     bi.SetSource(ms);
     return bi;
}
private byte[] ReadFully(Stream input)
{
        byte[] buffer = new byte[input.Length];
        using (MemoryStream ms = new MemoryStream())
        {
            int read;
            while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            return ms.ToArray();
        }
 }

使用BitmapImage打开大型图像.SetSource -内存不足异常

你基本上要么耗尽内存(记住Silverlight是沙盒)和/或资源(即句柄或类似的)。

查看你所描述的问题的解决方案,包括源代码等