我需要最快的方式在局域网上传输C#中的位图对象。
阿卜杜勒·哈利克
发布于 2009-12-14 14:24:01
下面是.NET V2.0 SP1和.NET 3.5版本的CopyFromScreen()中的一个bug。它会泄漏一个句柄,一段时间后,你会用完可用的句柄,并得到像这样奇怪的错误消息。你不能在它当前的状态下使用它,通过P/调用Windows API函数检查这个线程的另一种方法。
在this链接上也有一个很好的解决方案。
发布于 2009-06-04 06:33:39
“最好”这个词充其量只是一个主观术语:-)
如果你谈论的是速度,那么它取决于位图的大小。当局域网以100 10MB的速度运行时,每10MB的文件大约需要1秒。对于小文件,只需按原样传输即可。在一定的文件大小下,它将变得值得压缩文件,传输它,并在另一端解压它,很简单,因为CPU grunt比网络grunt更快。
但我认为你会谈论非常大的文件,以使额外的编码是值得的。
更新:
既然你谈到了屏幕截图帧,我们就假设我们是在1280x1024,32bpp。然后,全屏将占用5M,这应该可以在100 will的LAN上传输不到一秒(其他网络流量允许)。在我看来,不值得再尝试加快速度,因为压缩的开销将超过节省的时间。
如果你要做视频传输,那就是另一回事了。然后,你不会为每一帧发送一个全新的图像--你将计算出增量并只传输这些信息,这依赖于屏幕通常每帧只有很小的变化的事实。
这取决于您将使用这些图像来做什么。一次截屏,只需发送二进制信息。其他的,好吧,你需要给我们更多细节。
对于视频传输,我们实际上已经在不同的压缩方法上做了一些工作。
您可能想要查看的最简单的方法是将屏幕划分为一个(例如) 16x16矩阵,并仅传输更改后的元素。
因此,例如,每个帧将由一个256位的位掩码组成,指示哪些元素发生了更改。然后,该位掩码后面是元素本身。
该算法意味着最小的帧增量是32字节(如果屏幕没有改变的话)。最大值仅比全屏转储大32个字节。
我们使用的另一种方法是简单地存储已更改的最右上角和最右下角像素位置,并将这两个值与它们所限定的整个矩形一起传输。
毫无疑问,您还可以使用其他方法,甚至在逐帧的基础上动态选择方法,以确保最小增量大小。
https://stackoverflow.com/questions/948845
复制相似问题