2017-06-20 338 views
0

正如標題所說,我有一個例外的問題。 「System.ArgumentException」。我得到它時,我試圖將字節數組轉換爲位圖圖像。這裏是拋出異常的代碼:參數無效內存流。 image.FromStream C#

MemoryStream ms = new MemoryStream(Buffer); 
ms.Position = 0; 
bmp = new Bitmap(ms); 
pictureBox1.Image = bmp; 

我也試過用圖像轉換器。而改爲bmp = new Bitmap(ms);使用此bmp = (Bitmap)image.FromStream(ms); 有趣的是,如果我會把任何這些(無論是與內存流或圖像轉換器)內的try catch塊。它會創建圖像,但它往往會遺漏一些部分(例如圖像的一半是可見的),但有時它會創建完整的圖像,並且在輸出中它仍然會說異常已被拋出..並引發異常。 - 對不起語法。 - 是的,我沒有嘗試尋找我的問題的解決方案,但我沒有找到任何東西

編輯: 看起來我忘了一些部分問題所以我這裏做。我正在做項目,將桌面圖像發送到另一個項目,併爲此,它需要發送字節...如果我會把那File.WriteAllBytes測試到第一個示例代碼ive添加失敗。但在發送它的一方工作。這是獲取桌面的圖像變成EM的字節代碼

using (var stream = new MemoryStream()) 
{ 
    bmp.Save(stream, ImageFormat.Jpeg); 
    Buffer = stream.ToArray(); 
} 

而在堆棧跟蹤它說的例外是在System.Drawing.Bitmap..ctor(流流)被拋出..

編輯2: 接收緩衝器:

   int ArraySize = acc.Receive(Buffer, 0, Buffer.Length, 0); 
       Array.Resize(ref Buffer, ArraySize); 
       MemoryStream ms = new MemoryStream(Buffer); 
       ms.Position = 0; 
       bmp = new Bitmap(ms); 
       pictureBox1.Image = bmp; //Dont mind the naming 

發送緩衝器:

   bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
       Graphics g = Graphics.FromImage(bmp); 
       g.CopyFromScreen(0, 0, 0, 0, bmp.Size); 
       using (var stream = new MemoryStream()) 
       { 
        bmp.Save(stream, ImageFormat.Jpeg); 
        stream.Flush(); 
        acc.Send(stream.ToArray()); 
       }//Dont mind the naming 

當然還有插座之間的背景連接等。

+1

字節數組中有什麼? – adv12

+0

您可能想要共享創建「緩衝區」的代碼,該問題很可能源於此處。 –

+0

作爲正確性的快速檢查,您可以使用適當的文件擴展名來調用'File.WriteAllBytes(filename,byteArray)'。如果打開文件時文件亂了,那麼你的字節數組內容有問題。 – JamieSee

回答

0

儘管您可以使用單個Send()操作發送整個圖像,但可能需要多個Receive()操作來接收整個圖像。您是否檢查您的ArraySize是否與您發送的數據大小相符?

你將不得不使用一個循環到接收整個事情,即:

int offset = 0; 
int received; 
while ((received = acc.Receive(Buffer, offset, Buffer.Length - offset, 0)) > 0) 
{ 
    offset += received; 
} 

假設緩衝區足夠大,這將繼續接收數據,直到對方關閉連接。

如果對方不打算關閉連接,你將不得不引入一種方法來知道何時停止接收,即。首先發送數據的大小(作爲固定的字節數),然後是數據本身。

+0

好吧,我會明天檢查這是否可行...因爲我現在必須走了 – user8126038