2016-09-01 9 views
0

내가 모든 유사한 문제에 검색하지만 여전히이 성공적으로 생성이 성공적으로 작동하는 서버 코드와 이미지 파일입니다하지만 경우에 문제(스트림)

를 해결할 수 난 이미지 파일에 액세스 할 수 없습니다.

image i = Image.FromStream (StreamObject);

참고 : 이미지 1 이미지가 너무 크지 내가이 문제 을 제어 할 수 있습니다 어떻게 스트림에 관련된 문제를 알고

은 ... 내가를 가져 오지하려면 올바른 이미지 형식을 가지고 어떤 이유로 이미지 객체에 저장된 이미지 .. 이미지의 수명 동안 스트림을 열어 둘 수있는 방법은 무엇입니까?

static void Main(string[] args) 
    { 
     IPAddress ipAdress = IPAddress.Parse("192.160.1.8"); 
     // Initializes the Listener 
     TcpListener tcpListener = new TcpListener(ipAdress, 8001); 
     tcpListener.Start(); 
     int no; 
     for (;;) 
     { 
      Socket socket = tcpListener.AcceptSocket(); 
      if (socket.Connected) 
      { 

       Stream os = File.OpenWrite("Target.jpg",); 
       byte[] buffer = new byte[8000000]; 
       NetworkStream networkStream = new NetworkStream(socket); 
       no = networkStream.Read(buffer, 0, 8000000); 
       os.Write(buffer, 0, no); 
       ///here the problem in the following line 
       /// 
        Image i = Image.FromFile("Target.jpg"); 
       /// 
       networkStream.Close(); 
       socket.Close(); 
       break; 

      } 
     } 

    } 

답변

1

바이트가 버퍼에 기록 된 동안 바이트가 디스크로 플러시되지 않았을 수 있습니다. 또한 제공된 코드 예제는 파일을 이미지로 읽는 동안 쓰기 위해 파일을 열어 두었습니다. 스트림과 같은 경우에는 이러한 유형의 메모리 오류를 방지하려면 using 문에 사용법을 래핑해야합니다.

static void Main(string[] args) 
{ 
    IPAddress ipAdress = IPAddress.Parse("192.160.1.8"); 
    // Initializes the Listener 
    TcpListener tcpListener = new TcpListener(ipAdress, 8001); 
    tcpListener.Start(); 
    int no; 
    for (;;) 
    { 
     Socket socket = tcpListener.AcceptSocket(); 
     if (socket.Connected) 
     { 
      byte[] buffer = new byte[8000000]; 
      using (Stream os = File.OpenWrite("Target.jpg")) 
      { 
       using (NetworkStream networkStream = new NetworkStream(socket)) 
       { 
        no = networkStream.Read(buffer, 0, 8000000); 
        os.Write(buffer, 0, no); 
       } 
      } 


      ///here the problem in the following line 
      /// 
       Image i = Image.FromFile("Target.jpg"); 
      /// 

      socket.Close(); 
      break; 

     } 
    } 

} 

또는, 아마 더 적절하게, 당신은 Image.FromStream를 사용하여 스트림에서 직접 GDI + 이미지를 만드는 것이 좋습니다. Image.FromStream 메서드는 여기에 문서화되어 있습니다 : https://msdn.microsoft.com/en-us/library/system.drawing.image.fromstream%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

+0

큰 감사 :) :) –

+0

FromStream은 더 많은 오류를 생성하기 때문에 FromFile()을 사용하고 있습니다. –