通过lan传输位图对象的最佳方法

时间:2009-06-04 06:20:42

标签: c# .net data-transfer

我需要在C#中通过局域网传输位图对象的最快方法。

Abdul Khaliq

2 个答案:

答案 0 :(得分:4)

“最佳”这个词充其量只是一个主观术语: - )

如果你在谈论速度,那么它取决于位图的大小。如果局域网以100Mbps的速度运行,那么对于每个10MB的文件,您可以预期大约1秒左右的时间。对于小文件,只需按原样传输即可。在一些文件大小的情况下,将文件压缩,传输它并在另一端解压缩是值得的,因为CPU grunt比网络grunt快。

但我认为你会谈论相当大的文件,以使额外的编码值得。

更新

由于你谈到了一个屏幕截图框架,让我们说我们在1280x1024,32bpp。全屏将占用5M,这应该可以在一秒钟内在100Mbps LAN上传输(其他网络流量允许)。在我看来,由于压缩的开销超过了节省的时间,因此尝试加快速度是不值得的。

如果你要进行视频转移,这是另一回事。那么你就不会为每一帧发送一个全新的图像 - 你只需要根据屏幕通常每帧只有一点点变化这一事实来计算增量并仅传输信息。

这取决于你将要使用的图像。一次性屏幕捕获,只需发送二进制信息。还有别的,你需要给我们更多细节。

对于视频传输,我们实际上已经完成了一些不同压缩方法的工作。

您可能希望看到的最简单的方法是将屏幕划分为(例如)16x16矩阵,并仅传输更改的元素。

因此,例如,每个帧将由256位位掩码组成,指示哪些元素已更改。然后,该位掩码后跟元素本身。

该算法意味着最小帧增量为32字节(如果屏幕未更改)。最大的只比全屏转储大32个字节。

我们使用的其他方法之一是简单地存储已更改的最多和最右下角的像素位置,并将这两个值与由它们限定的整个矩形一起传输。

毫无疑问,您可以使用其他方法,甚至可以逐帧动态选择方法,以确保最小增量大小。

答案 1 :(得分:0)

这是.NET V2.0 SP1中的bug和CopyFromScreen()的.NET 3.5版本。它泄漏了一个句柄,一段时间后你会用完可用的句柄并得到像这样的怪异错误信息。您无法在当前条件下使用它,请通过P /调用Windows API函数检查此线程以获取其他方法。

this链接上找到了一个很好的解决方案。