2011-10-08 7 views
2

C# Windows 양식을 사용하고 있습니다.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

어두운 곳에서 촬영 : jpeg 파일의 예상 크기보다 약간 큰 용량 값으로 MemoryStream을 초기화 해보십시오. (너비 * 높이는 아마도 적당한 값입니다). – selbie

+0

@JatSing 이것은 일반적인 오류입니다. Google에서 40,000 페이지입니다. 우리가 '이미지를 포함하여 재현'을 제공하기를 원한다면. 과거에는 매우 큰 웹 사이트에서이 오류가 발생했습니다. 이미지를 추적 할 때 이미지가 실제로 손상되었지만 다른 이유가 많이 있습니다. –

답변

1

GDI + 비트 맵은 스레드로부터 안전하지 않으므로 이러한 오류는 여러 스레드에서 액세스되는 이미지에서 자주 발생합니다. 여기에서 발생할 수있는 것처럼 보입니다 (예 : 이미지를 렌더링하는 PictureBox 및 버튼 클릭 핸들러 스레드에 저장되는 이미지).

저장 작업을 완료 한 후 Bitmap을 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; 
     } 
} 
관련 문제