2011-11-07 47 views
0

我正在創建需要在將圖像上傳到服務器之前顯示圖像縮略圖的Silverlight 4應用程序。代碼中,我有完全適用於下15MB的圖像,但是當我嘗試打開大圖像(一些超過30MB)我得到以下異常:使用BitmapImage.SetSource打開大圖像 - 內存不足異常

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(); 
     } 
} 

回答

2

你基本上是已執行內存不足(記得Silverlight是沙箱)和/或資源(即Handles或類似的)。

檢查this出一個解決您描述包括

+0

@Yehia源代碼等問題 - 感謝您的鏈接,但我的代碼來調整縮略圖實際上是基於這樣很職務。然而,我的問題是我無法打開原始圖像,以調整它的大小。 – MarkB29

+0

@ MarkB29如果你甚至無法打開原始圖像,那麼我懷疑silverlight沒有設置爲使用所有可用的內存......沒有什麼可以從你的代碼AFAIK解決,因爲這是安全敏感的...也有差異瀏覽器內和瀏覽器外的Silverlight應用程序之間... – Yahia