2010-01-29 7 views
4

DB에 이미지를 저장하는 것에 익숙합니다. 매우 직설적이라고 생각 했는데도 그렇지 않았습니다. 내가 뭘 하려는지 모든 형식으로 같은 컴퓨터에서 이미지 파일을 읽고, 그림 상자에 표시하고 바이트로 이미지를 변환하여 DB에 저장합니다. 지금까지 그림 상자에 이미지를 표시 할 수 있지만 이미지를 바이트로 변환 할 수는 없습니다. 내 코드는 다음과 같습니다.이미지를 바이트로 변환 할 수 없습니다. [] C#

private void DisplayImage() 
    { 
     if (openFileDialog.ShowDialog(this) == DialogResult.OK) 
     { 
      try 
      { 
       Stream file; 
       if ((archivo = openFileDialog.OpenFile()) != null) 
       { 
        using (file) 
        { 
         pictureBox.Image = Image.FromStream(file); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       ... 
      } 
     } 
    } 

그림 상자에 이미지를 표시하는 간단한 방법입니다. 진짜 문제는 다음과 같은 방법입니다 : 무슨 일이야에

System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+. 

어떤 아이디어 :

public static byte[] ConvertImageToBytes(Image image) 
    { 
     if (image != null) 
     { 
      MemoryStream ms = new MemoryStream(); 
      using (ms) 
      { 
       image.Save(ms, ImageFormat.Bmp); 
       byte[] bytes = ms.ToArray(); 

       return bytes; 
      } 
     } 
     else 
     { 
      return null; 
     } 
    } 

가 메모리 스트림에 이미지를 저장하려고, 나는 오류가?

+0

오류는 항상 일어나고, 또는 드물게, 또는 오랜 시간 동안 응용 프로그램을 사용하여 이후 : 나를 위해 일한

하나 개의 솔루션은이 같은 이미지의 복사본을 만드는 것입니다? – Chris

+0

첫 번째 방법에서는 'file'변수를 할당하지 않습니다 ...이 코드는 실제 코드의 추출물이라고 가정합니다. 그렇지 않으면 컴파일러는 할당되기 전에 'file'변수가 사용되었다고 불평 할 것입니다. –

답변

1

내 자신의 질문에 대답하는 것은 어리석은 일이지만, 이미지 개체를 바이트로 변환하려면 원본 스트림을 열어 두어야한다는 것을 알았습니다. 이 문제는 내가 기억할 수없는 다른 페이지에서 보았습니다. 스트림을 열린 상태로 두어 테스트 한 결과 사실이었습니다. 그래서 형식이 문제가 아니 었습니다. 그러나 나는 여러분 모두의 충고를 받아 들여 별도의 디렉토리에 이미지를 저장합니다. 도와 줘서 고마워!

1

이 예외는 일반적으로 이미지를 잘못된 형식으로 저장하려고한다는 것을 의미합니다. 코드에서 ImageFormat.Bmp을 지정하십시오. 실제로 비트 맵 이미지입니까, 아니면 JPEG 또는 PNG에서로드 했습니까? 로드 한 형식과 다른 형식으로 저장하려고하면 documentation에 지정된대로 ExternalException으로 실패합니다.

덧붙여서 나는 이미지를 데이터베이스에 저장하는 것을 권장하지 않으며 대부분의 사람들이 동의 할 것이라고 나는 믿는다. 데이터베이스가이 작업을 처리 할 수는 있지만 최적화되지 않았으므로 데이터베이스와 응용 프로그램의 성능이 모두 저하됩니다. SQL Server 2008 FILESTREAM 열을 사용하지 않는 한 이미지를 파일 시스템에 저장하는 것이 더 효율적입니다.

+0

+1 - 나는 같은 것으로 의심합니다. 이미지 형식이 일치하지 않습니다. – Gishu

3

원본 이미지의 RawFormat 속성을 기본적으로 Bitmap이 아닌 Save 메서드의 매개 변수로 사용해야합니다. 이렇게하면 이미지 형식 유형 오류가 발생하지 않습니다. 예 :

실제로 이미지를 파일 시스템에 저장하고 파일 경로 (선호되는 경우 상대적)를 데이터베이스에 저장하는 것이 좋습니다.

데이터베이스의 BLOB (즉, 이미지 등)는 인덱싱 할 수 없으며 보조 액세스가 느린 데이터베이스 영역에 저장되며 데이터베이스 크기가 급격히 감소합니다 (느린 백업 등).

2

캔트 당신은 단순히 파일을 읽고 파일 클래스를 사용하여 바이트 []에로드 :

byte[] imgData = System.IO.File.ReadAllBytes(@"C:\My Pic\Myfile.jpg"); 

당신은 당신의 열기 대화 상자에서 이미지 경로를 선택할 수 있습니다.

0

이 문제는 이미지의 수명 동안 스트림이 열려 있어야하며 그렇지 않으면 실패합니다.

using (var ms = new MemoryStream(bytes)) 
{ 
    _image = new Bitmap(Image.FromStream(ms)); 
} 
관련 문제