2009-06-04 38 views
0

我需要通過C#中局域網傳輸位圖對象的最快方式。通過局域網傳輸位圖對象的最佳方式

阿卜杜勒·哈利克

+2

請問你能更具體嗎?因爲知道我想:「郵件和電子郵件的事情」,但這是多餘的,而不是你想聽到的。 – Natrium 2009-06-04 06:29:10

+0

我有一個位圖對象讓我們說一個屏幕捕獲的實例。我需要通過局域網傳輸它。我需要知道通過局域網傳輸它或者以二進制格式發送它的最快速的方法是什麼? – 2009-06-04 06:33:17

回答

0

這是NET V2.0 SP1和.NET 3.5版CopyFromScreen()中的bug。它泄漏了一個句柄,過了一段時間你會用完可用的句柄並得到這樣的怪異錯誤消息。你不能在它現在的情況下使用它,檢查這個線程的另一種方法是通過P /調用Windows API函數來完成它。

this鏈接上也有一個很好的解決方案。

4

單詞「最好」的,充其量是一個主觀的術語:-)

如果你談論的是速度,那麼它取決於位圖有多大。以100Mbps的速度運行的局域網,你可以預計每個10MB的文件大概在1秒左右。對於小文件,只需按原樣傳輸。在某些文件大小的情況下,將文件壓縮起來,傳輸並在另一端進行解壓縮,這僅僅是因爲CPU咕嚕聲比網絡咕嚕聲快。

但我想你會談論相當大的文件,以使額外的編碼值得。

更新:

既然你談論一個屏幕捕捉框,讓我們說我們是在1280x1024的分辨率,32bpp的。然後全屏幕將佔用5M,這應該可以在一秒內(其他網絡通信允許)在100Mbps LAN上傳輸。在我看來,這是不值得的,因爲壓縮的開銷將超過節省的時間,所以試圖加快速度。

如果您將要做視頻轉移,那是另一回事。那麼你不會爲每一幀都發送一個全新的圖像 - 你只需要制定增量並只傳輸這些信息,這取決於屏幕通常每幀只會改變一點。

這取決於你將要使用的圖像。一次性截屏,只需發送二進制信息。除此之外,你需要給我們更多的細節。

對於視頻傳輸,我們實際上已經對不同的壓縮方法做了一些工作。

最簡單的你可能想看看的是將屏幕分成一個(例如)16x16矩陣,只傳輸改變的元素。因此,例如,每個幀將由256位的位掩碼組成,指示哪些元素已經改變。然後,該位掩碼後面是元素本身。

該算法意味着最小的幀增量是32字節(如果屏幕沒有改變)。最大的僅比全屏轉儲大32個字節。

我們使用的其他方法之一是簡單地存儲已經改變的最靠前和最靠右的像素位置,並將這兩個值與由它們包圍的整個矩形一起轉移。

毫無疑問,您還可以使用其他方法,即使在逐幀基礎上動態選擇方法以確保最小增量大小。

相關問題