System.Drawing.Image 관련 문제해결

예외 정보

예외 정보: System.Runtime.InteropServices.ExternalException: GDI+에서 일반 오류가 발생했습니다.
스택 추적:
[System.Runtime.InteropServices.ExternalException: GDI+에서 일반 오류가 발생했습니다.]
   위치: System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
   위치: System.Drawing.Image.Save(Stream stream, ImageFormat format)
   위치: Sample.CO01001M.Save()
   위치: Sample.CO01001M.btnSave_Click(Object sender, EventArgs e)

관련 코드

private void FunctionDoSomething(){   
  ...
  DataRowView rv = 데이터로뷰;
  if (rv == null) return;

  if (rv.Row["이미지컬럼"] != null && rv.Row["이미지컬럼"] != DBNull.Value)
  {
      //MessageBox.Show(rv.Row["이미지컬럼"].GetType().ToString());
      byte[] buffer = rv.Row["이미지컬럼"] as byte[];
      System.IO.MemoryStream mStream = new System.IO.MemoryStream(buffer);
      mStream.Flush();
      Image tImage = Image.FromStream((System.IO.Stream)mStream, true, true);

      this.pic픽쳐박스Control.Image = tImage;
      mStream.Close(); // 이부분 때문에 오류발생
  }    
}

private void FunctionDoSomethingTwo(){
  System.IO.MemoryStream mStream = new System.IO.MemoryStream();
  byte[] buffer = null;
  Image img = this.pic픽쳐박스Control.Image as Image;

  if (img != null)
  {
      img.Save(mStream, img.RawFormat); // 여기서 오류발생
      buffer = mStream.ToArray();
  }
  mStream.Close();
}

해결 방법

FunctionDoSomething() 를 호출하여 pic픽쳐박스Control에 이미지를 설정하고, FunctionDoSomethingTwo() 를 호출하여 pic픽쳐박스Control 의 이미지로 부터 Image 객체의 byte[]을 생성할때 오류 발생가 발생합니다.

FunctionDoSomething() 에서 pic픽쳐박스Control 에 이미지를 설정한 후 Stream 객체를 닫지 않아야 합니다.

관련 자료

“System.Drawing.Image 관련 문제해결”에 대한 한개의 댓글

  1. 핑백: bbon's me2DAY

댓글 남기기