2011-08-20 53 views
-1

我試圖接收圖像表單服務器,並希望將它顯示在WM應用程序的Picturebox中。我正在成功接收圖像流,並且找不到將其顯示到PictureBox的任何方法。在Windows程序中,我們在Image類中有一個方法,它是FromStream(Image.FromStream),但此功能在Compact Framework 3.5中不可用。我也試過以下代碼:從C#中的Windows Mobile流中獲取圖像

private void button1_Click(object sender, EventArgs e) 
    { 
     Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     IPAddress IP = IPAddress.Parse("192.168.1.2"); 
     IPEndPoint IPE = new IPEndPoint(IP, 4321); 
     s.Connect(IPE); 
     byte[] buffer = new byte[55296]; 
     s.Receive(buffer, buffer.Length, SocketFlags.None); 
     MemoryStream ms = new MemoryStream(buffer); 
     Image im = new Bitmap(ms); //EXCEPTION 
     pictureBox1.Image = im; 
    } 

但它給出了一個例外。沒有提供例外情況的詳細信息,VS僅顯示帶有「例外」文本的對話框。

回答

0

您的圖像大小是否小於緩衝區的大小?如果不是所有的多餘數據都會丟失並引發異常。

你也可以嘗試沒有指定的緩衝區長度。

 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
     { 
      IPAddress IP = IPAddress.Parse("192.168.1.2"); 
      IPEndPoint IPE = new IPEndPoint(IP, 4321); 
      s.Connect(IPE); 
      byte[] buffer = new byte[55296]; 
      int rec = s.Receive(buffer, SocketFlags.None); 
      using (MemoryStream ms = new MemoryStream(buffer, 0, rec)) 
      { 
       Image im = new Bitmap(ms); 
       pictureBox1.Image = im; 
      } 
     } 
+0

圖像大小爲3.55kb,緩衝區大小約爲54kb –

0

你必須檢查,以便插座的Receive方法的返回值來確定你的 位圖緩衝區有多大:

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    IPAddress IP = IPAddress.Parse("192.168.1.2"); 
    IPEndPoint IPE = new IPEndPoint(IP, 4321); 
    s.Connect(IPE); 
    byte[] buffer = new byte[55296]; 
    int rec = s.Receive(buffer, buffer.Length, SocketFlags.None); 
    MemoryStream ms = new MemoryStream(buffer, 0, rec); 
    Image im = new Bitmap(ms); 
    pictureBox1.Image = im; 

希望,這會有所幫助。

+0

仍然有相同的異常發生。 –

+0

接收的字節數是否等於圖像的大小?你只傳輸圖像的像素? – Hans