2010-03-30 41 views
1

問候,試圖轉換字節[]爲圖像......但有平臺的問題涉及

目前,我試圖開發一個應用程序,採用的是從Linux下C傳輸到我們一個字節數組語言程序跨TCPClient(流)並將其重新組裝成image/jpg。 「發送」應用程序是由非現場開發人員開發的,他聲稱圖像在測試環境(所有Linux)中沒有任何問題或錯誤重新組裝成圖像...

但是,我們並不那麼幸運。我(相信)我們成功地獲取了所有發送的數據,並將其存儲爲字符串(讓我們追加流直到它完成),然後將其轉換回字節[]。這似乎工作正常...

但是,當我們從字符串[]我們得到流(和我們的字符串程序集),並嘗試將其轉換爲圖像使用System.Drawing.Image.FromStream ()我們得到錯誤....任何人有任何想法我們做錯了什麼?或者,有沒有人知道這是一個跨平臺的問題?我們正在爲Windows XP和C#.net開發我們的應用程序,但非現場開發人員在c和Linux中完成了他的工作......或許關於每個操作系統如何將圖像隱藏到字節數組中,可能會有所不同?

無論如何,這裏是將我們收到的ByteArray(從TCPClient流)轉換爲圖像的代碼。此代碼的工作,當我們從測試機我們建立上XP上運行發送圖像,而不是從Linux中...

 System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
     byte[] imageBytes = encoding.GetBytes(data); 

     MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); 

     // Convert byte[] to Image 
     ms.Write(imageBytes, 0, imageBytes.Length); 
     System.Drawing.Image image = System.Drawing.Image.FromStream(ms, false); 
       <-- DIES here, throws a {System.ArgumentException: Parameter is not valid.} error 

任何意見,建議,理論,或幫助將不勝感激!請告訴我???

祝你一切順利!提前致謝!

格雷格

+2

你能不能給我們的價值觀前100個字節左右? – 2010-03-30 22:31:12

回答

2

首先,如果你使用一個字符串來保存您的二進制數據,那麼你將你的字節值轉換成Unicode,然後將Unicode的回字節,所以你可能會破壞數據。至少你是低效的(在時間和空間上)。消除字符串和ASCII編碼 - 在接收到數據字節時,將數據字節直接寫入存儲器流中,並且會正確處理它們以組裝二進制緩衝區。

其次,您正在從您收到的緩衝區中創建一個MemoryStream。不需要將這些數據寫入到MemoryStream中,因爲它已經被構造函數複製了,即刪除示例代碼的ms.Write()行。

最後,根據上面概述的兩種情況,您可能需要在嘗試從中讀取圖像數據之前將MemoryStream追回到開頭,否則您會嘗試讀取來自流末尾的圖像,並在那裏找不到數據。

0

圖像數據最像是以Base64字符串形式發送的。爲了證實這一點,你需要發送字符串數據的第一位。

如果是BASE64,這是轉換爲字節方式:

byte[] imageBytes = Convert.FromBase64String(data); 
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); 

// Convert byte[] to Image 
ms.Write(imageBytes, 0, imageBytes.Length); 

還要確保沖洗設置MemoryStream.Position的開頭:

ms.Flush(); 
ms.Position = 0; 
System.Drawing.Image image = System.Drawing.Image.FromStream(ms, false);