C#尽可能快地通过套接字发送图像



我试图通过插座上的图像尽可能快地发送尝试压缩...比较图像...它仍然工作慢...顺便说一句,我试图在压缩和大小相同之前和之后保存图像.... 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 { }
        }

顺便说一句,我见过一些使用套接字的人。表示,没有将图像保存为流式传输。...你们可以解释区别吗?并建议我在代码中有什么问题,我该如何改进算法?

您的问题确实是根据"太宽"作为一个紧密原因的限制。通过网络发送图像数据的一般问题是一个非常广泛的研究领域,具有大量不同的技术,特定的应用程序/用户 - 塞纳里奥确定哪种技术实际上是最好的。

也就是说,您可以对所需的代码做出一个非常明显的更改,并且根据瓶颈的位置,可能会加快它的速度。

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

因此,不仅可以再次压缩它几乎什么也没做到,而且花费了很多CPU,什么也不做。不要那样做。只需发送byte[]数据,而无需通过GzipStream运行。


现在,所有话都…

正如我提到的,这种更改是否真的有助于所有其他因素,包括位图的大小以及您使用的网络的速度。如果即使您在问题中发布的效率低下的代码也已经使网络饱和,那么加速该代码就无济于事。

用来处理网络带宽的技术包括(但不限于):

  1. 使用有损耗的压缩(例如JPEG,MPEG等),因此简单地丢弃了要发送太多花费的信息。
  2. 使用差分压缩技术(例如MPEG,MP4,QuickTime等),这利用了一个事实,即处理电影视频时,从一个帧到另一个帧的大多数像素都没有变化或至少是非常相似。
  3. 发送渲染命令而不是位图数据。这通常用于诸如VNC或Microsoft的远程桌面/终端服务器API之类的东西,并利用了屏幕上图纸通常会使用相对简单的绘图命令(填充/填写矩形,图纸文本)影响大量像素的事实。,绘画小位图等)。

在许多情况下,这些技术以各种方式合并以实现最高性能。

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

相关内容

  • 没有找到相关文章

最新更新