0

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

阿卜杜勒哈利克

4

2 回答 2

4

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

如果您在谈论速度,那么这取决于位图有多大。对于以 100Mbps 运行的 LAN,您可以预期每 10MB 文件大约需要 1 秒。对于小文件,只需按原样传输即可。在某些文件大小下,将文件压缩、传输并在另一端解压缩将变得值得,这仅仅是因为 CPU grunt 比网络 grunt 快。

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

更新:

既然您谈论屏幕捕获帧,假设我们的分辨率为 1280x1024,32bpp。然后全屏将占用 5M,这应该可以在一秒钟内在 100Mbps 的 LAN 上传输(其他网络流量允许)。在我看来,尝试再加快速度是不值得的,因为压缩的开销会超过节省的时间。

如果您要进行视频传输,那是另一回事。然后你不会为每一帧发送一个全新的图像 - 你会计算出增量并仅传输该信息,这取决于屏幕通常每帧只改变一点的事实。

这取决于您要使用这些图像的目的。一次截屏,只需发送二进制信息。其他任何事情,好吧,你需要给我们更多的细节。

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

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

因此,例如,每一帧将包含一个 256 位的位掩码,指示哪些元素已更改。然后,该位掩码后面是元素本身。

该算法意味着最小的帧增量是 32 字节(如果屏幕没有改变)。最大的只比全屏转储大 32 字节。

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

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

于 2009-06-04T06:33:38.867 回答
0

这是 .NET V2.0 SP1 和 .NET 3.5 版本的 CopyFromScreen() 中的一个错误。它泄漏了一个句柄,一段时间后你会用完可用的句柄并得到像这样的奇怪错误消息。您不能在目前的情况下使用它,请检查此线程以通过 P/Invoking Windows API 函数来执行此操作。

在此链接上也找到了一个不错的解决方案。

于 2009-12-14T06:24:00.970 回答