c#通过socket发送图像和posibble一样快

你好我们试图尽可能快地发送套接字试图压缩… comapre图像…它仍然工作很慢…顺便说一下我试图在压缩之前和之后保存图像和大小是相同的…. 1或2 kb les …

看看客户端代码:

Bitmap pre; private void Form2_Load(object sender, EventArgs e) { pre = GetDesktopImage(); prev = Compress(ImageToByte(pre)).Length; theThread = new Thread(new ThreadStart(startSend)); theThread.Start(); } Bitmap curr; byte[] compressed; private void startSend() { sck = client.Client; s = new NetworkStream(sck); while (true) { curr = GetDesktopImage(); compressed = Compress(ImageToByte(curr)); if (Math.Abs(compressed.Length - prev) > 500) { bFormat.Serialize(s, compressed); prev = compressed.Length; count++; } } } 

压缩方法:

 byte[] Compress(byte[] b) { using (MemoryStream ms = new MemoryStream()) { using (GZipStream z = new GZipStream(ms, CompressionMode.Compress, true)) z.Write(b, 0, b.Length); return ms.ToArray(); } } byte[] ImageToByte(Image img) { ImageConverter converter = new ImageConverter(); return (byte[])converter.ConvertTo(img, typeof(byte[])); } 

这是个方面:

  while (true) { try { bFormat = new BinaryFormatter(); inBytes = bFormat.Deserialize(stream) as byte[]; inImage = ByteToImage(Decompress(inBytes)); theImage.Image = (Image)inImage; count++; label1.Invoke(new Action(() => label1.Text = count.ToString())); } catch { } } 

顺便说一句,我见过一些人使用socket.send并没有将图像保存为流……你们可以解释这种差异吗? 并建议我在我的代码中有什么问题,如何改进我的算法? ty人

你的问题实际上是将“太宽泛”作为一个接近的理由来推动极限。 通过网络发送图像数据的一般问题是一个非常广泛的研究领域,具有大量不同的技术,特定应用/用户场景确定哪种技术实际上是最佳的。

也就是说,根据瓶颈的位置,您可以对所需的代码进行一次非常明显的更改,并且可以加快速度。

具体来说,您使用ImageConverter.ConvertTo()Bitmap对象转换为byte[] ,然后使用GzipStream压缩该字节数组。 这个问题是ConvertTo()已经压缩了数据; 它返回的byte[]包含表示为PNG格式的原始位图,这是一种相当不错的无损压缩算法。

因此,不仅压缩它几乎不能实现任何东西,它会花费你很多CPU来做任何事情。 不要那样做。 只需按原样发送byte[]数据,而不通过GzipStream运行它。

现在,所有这些……

正如我所提到的,这种变化是否真的对所有这些有所帮助取决于其他因素,包括位图的大小,以及您使用的网络速度有多快。 如果你已经在你的问题中发布的效率低下的代码已经使网络饱和,那么加速代码就无济于事了。

用于处理网络带宽作为瓶颈的技术包括(但不限于):

  1. 使用有损压缩(例如JPEG,MPEG等),因此简单地丢弃发送成本太高的信息。
  2. 使用差分压缩技术(例如MPEG,MP4,Quicktime等),其利用了当处理运动图像video时,从一帧到下一帧的大多数像素未改变或至少非常相似的事实。
  3. 发送渲染命令而不是位图数据。 这通常用于VNC或Microsoft的远程桌面/终端服务器API之类的事情,并利用屏幕绘制通常使用相对简单的绘图命令(填充/概述矩形,绘制文本)影响大量像素的事实,绘制小位图等)。

在许多情况下,这些技术以不同方式组合以实现最大性能。

如果你想使用这些技术,你需要做的不仅仅是在Stack Overflow上提问。 提供有关这些技术的广泛文档和教程远远超出了本网站的范围。 您需要自己研究它们,或者甚至更好地使用现有的实现来实现您的目标。