2013-05-23 2 views
0

저는 버퍼에서 이미지를 가져 오는 클래스가 있으며 이미지는 이미지를 저장할 변수 유형 이미지로 설정됩니다. 내가 생성자에 다음 코드를 가지고 WindowsForm에서 클래스의 이미지를 양식의 그림 상자로 설정하십시오.

class MyClass 
{ 
    public Image MyImage; 
    private void ReadingCallBack(IAsyncResult ar) 
    { 
     Socket CurrentSocket = null; 

     try 
     { 
      CurrentSocket = (Socket)ar.AsyncState; 
      int recvsize = CurrentSocket.EndReceive(ar); 
      Array.Resize(ref buffer, recvsize); 
      string stream = ASCIIEncoding.ASCII.GetString(buffer); 
      switch (stream.Substring(stream.IndexOf('[') + 1, stream.IndexOf(']') - 1)) 
      { 
       case "Screenshot": 

        byte[] imgbuff = new byte[buffer.Length - 12]; 
        Buffer.BlockCopy(buffer, 12, imgbuff, 0, imgbuff.Length); 

        MemoryStream ms = new MemoryStream(imgbuff); 
        MyImage = Image.FromStream(ms); 

        ms.Close(); 
        break; 
      } 

      buffer = new byte[1024 * 5000]; 
      CurrentSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReadingCallBack), CurrentSocket); 
     } 
     catch (Exception er) 
     { 
      //etc 
     } 
    } 
} 

: WindowsForm은 사용자가 원하는 때마다 호출된다.

MyClass Class = new MyClass(); 
while (Class.MyImage == null) 
{ 
    System.Threading.Thread.Sleep(1); 
    Application.DoEvents(); 
} 

pictureBox1.Image = Class.MyImage; 

하지만, 이미지가있는 PictureBox에 할당되지 않습니다, 이미지 변수는 항상 null입니다.

버퍼에서 가져온 바이트로 내 HDD에 이미지 파일을 만들어서 이미지가 실제로 존재하는지 확인했는데 아무 문제없이 이미지가 성공적으로 만들어졌습니다.

내가 잘못 했습니까?

+0

코드가 컴파일되지 않습니다. 올바른 'MyClass' 정의로 실제 코드를 얻으십시오. –

+0

** 코드 **를 게시하는 것이 좋습니다 **. 그 단편에서 프로그램의 논리를 이해하는 것은 심지어 어렵습니다. –

+0

잠깐. 코드를 업데이트하겠습니다. –

답변

1

개체를 인스턴스화 할 때 이미지 메모리가 해제되는 문제가 발생할 수 있습니다. try/catch에서 오류를 트래핑하고 있습니까? 그 MemoryStream 객체가 삭제 될 때 생성 된 이미지가 그렇게 될 것이라고 생각합니다.

+0

이것 좀보세요 : http://stackoverflow.com/questions/11741719/saving-image-to-memorystream-generic-gdi-error – DonBoitnott

0

MyClass의 이미지 생성은 메소드에 있어야하며, 그런 다음 buffer as argument를 사용하여 해당 메소드를 호출해야합니다.

+0

Ehm. 코드 예제 일뿐입니다. 내 클래스의 코드는 실제로 메서드에 –

+0

하지만 여전히 양식에서 해당 메서드를 호출하고 버퍼 인수를 전달해야합니다. –

관련 문제