2012-07-30 141 views
4

我讓這段代碼接收圖像並將其轉換爲位圖圖像,但它不起作用。字節數組到位圖圖像

下面是代碼:

public void ReceiveImage() 
{ 
    NetworkStream stream = new NetworkStream(socket); 
    byte[] data = new byte[4]; 
    stream.read(data,0,data.length,0) 
    int size = BitConverter.ToInt32(data,0); 
    data = new byte[size]; 
    stream.read(data,0,data.length) 
    MemoryStream imagestream = new MemoryStream(data); 
    Bitmap bmp = new Bitmap(imagestream); 
    picturebox1.Image = bmp; 
} 

它得到:

Bitmap bmp = new Bitmap(imagestream); 

,給我這個錯誤:

Parameter is not valid

+0

@Tarek ...這是C#代碼?當我將它複製到Visual Studio中時,它有一些錯別字。 – MikeTWebb 2012-07-30 22:11:56

+0

是它的C#,但是你必須使用System.IO鍵入 ;使用System.Net.Sockets的 ;使用System.Net的 ; – 2012-07-30 22:14:11

+0

並且還使用System.Drawing.Imaging; – 2012-07-30 22:16:29

回答

-1

試試這個:

int size = BitConverter.ToInt32(data.Reverse().ToArray(),0); 
+6

'試試這個'只是一個評論。 '試試這個。這應該工作,因爲......是一個答案。 – 2012-07-30 22:48:33

0

我假設你有一個表,並希望從數據庫接收圖片。

int cout = ds.Tables["TableName"].Rows.Count; 
       if (cout > 0) 
       { 
        if (ds.Tables["TableName"].Rows[cout - 1]["Image"] != DBNull.Value) 
        { 
         var data = (byte[])(ds.Tables["TableName"].Rows[cout - 1]["Image"]); 
         var stream = new MemoryStream(data); 
         pictureBox1.Image = Image.FromStream(stream); 
        } 
        else 
        { 
         pictureBox1.Image = null; 
        } 
       } 
+1

你的假設可能是錯誤的。請參閱代碼'NetworkStream' – 2012-07-30 22:26:47

1

你可能不stream.read(data,0,data.length)因爲Read接收到足夠的字節數並不能保證它會讀data.length字節。您必須檢查其返回值並繼續讀取,直到讀取data.Length字節。

參見:Stream.Read Method的返回值

int read = 0; 
while (read != data.Length) 
{ 
    read += stream.Read(data, read, data.Length - read); 
} 

PS:我假設length S和read s爲錯別字。

+0

發生此錯誤 '無法從傳輸連接讀取數據。可以執行套接字上的操作,因爲系統缺少足夠的緩衝空間或者隊列已滿。 – 2012-07-30 23:01:25

+0

檢查'尺寸'。它可以[網絡字節順序](http://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/)。你可以嘗試'IPAddress.NetworkToHostOrder(BitConverter.ToInt32(data,0))' – 2012-07-30 23:06:27

+0

不工作,來'data = new byte [size];' 然後給我這個錯誤 '算術運算導致溢出' – 2012-07-30 23:26:02

7

這是一種替代方法

int w= 100; 
int h = 200; 
int ch = 3; //number of channels (ie. assuming 24 bit RGB in this case) 

byte[] imageData = new byte[w*h*ch]; //you image data here 
Bitmap bitmap  = new Bitmap(w,h,PixelFormat.Format24bppRgb); 
BitmapData bmData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); 
IntPtr pNative  = bmData.Scan0; 
Marshal.Copy(imageData,0,pNative,w*h*ch); 
bitmap.UnlockBits(bmData); 
+0

使用此代碼,我應該包括什麼? – 2015-08-13 16:34:55

+1

感謝我的工作 – predactor 2017-05-13 23:51:44