2011-10-08 50 views
2

我正在使用C#窗體。當試圖將圖像保存到MemoryStream中時發生GDI +異常的一般錯誤

我的代碼:

private void Openbutton_Click(object sender, EventArgs e) 
{ 
     OpenFileDialog openFileDialog = new OpenFileDialog(); 
     if (openFileDialog.ShowDialog() == DialogResult.OK) 
     { 
      SurveyDiagrampictureBox.Image = Bitmap.FromFile(openFileDialog.FileName); 

      MemoryStream memoryStream = new MemoryStream(); 
      SurveyDiagrampictureBox.Image.Save(memoryStream, ImageFormat.Jpeg); 
      SurveyDiagram = memoryStream.GetBuffer(); 
     } 
} 

它並不總是發生,異常踩着這條線時拋出:SurveyDiagrampictureBox.Image.Save(memoryStream, ImageFormat.Jpeg);

異常消息:

類型的未處理的異常'System.Runtime.InteropServices.ExternalException'發生在 System.Drawing.dll

附加信息:GDI +中發生了一般性錯誤。

+0

好的,有用的錯誤信息FTW。 – Phil

+0

在黑暗中拍攝:嘗試初始化MemoryStream,其容量值稍大於jpeg文件的預期大小。 (寬度*高度可能是一個體面的估計)。 – selbie

+0

@JatSing這是一個常見的錯誤,在Google上有40,000頁。如果你希望我們幫忙'提供一個repro - 包括圖像'。在過去,我在一個非常大的網站上發現了這個錯誤,當我們追蹤它時,圖像實際上是腐敗的,但是還有其他很多原因。 –

回答

1

GDI +位圖不是線程安全的,所以這些錯誤通常是從多個線程上訪問的圖像到達的。這似乎可能在這裏發生(例如,PictureBox渲染圖像和圖像被保存在按鈕單擊處理程序線程中)。

完成保存操作後,將位圖分配給PictureBox怎麼樣?

private void Openbutton_Click(object sender, EventArgs e) 
{ 
     OpenFileDialog openFileDialog = new OpenFileDialog(); 
     if (openFileDialog.ShowDialog() == DialogResult.OK) 
     { 
      Image img = Bitmap.FromFile(openFileDialog.FileName); 

      MemoryStream memoryStream = new MemoryStream(); 
      img.Save(memoryStream, ImageFormat.Jpeg); 
      SurveyDiagram = memoryStream.GetBuffer(); 

      SurveyDiagrampictureBox.Image = img; 
     } 
} 
相關問題