我试图通过插座上的图像尽可能快地发送尝试压缩...比较图像...它仍然工作慢...顺便说一句,我试图在压缩和大小相同之前和之后保存图像.... 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
运行。
现在,所有话都…
正如我提到的,这种更改是否真的有助于所有其他因素,包括位图的大小以及您使用的网络的速度。如果即使您在问题中发布的效率低下的代码也已经使网络饱和,那么加速该代码就无济于事。
用来处理网络带宽的技术包括(但不限于):
- 使用有损耗的压缩(例如JPEG,MPEG等),因此简单地丢弃了要发送太多花费的信息。
- 使用差分压缩技术(例如MPEG,MP4,QuickTime等),这利用了一个事实,即处理电影视频时,从一个帧到另一个帧的大多数像素都没有变化或至少是非常相似。
- 发送渲染命令而不是位图数据。这通常用于诸如VNC或Microsoft的远程桌面/终端服务器API之类的东西,并利用了屏幕上图纸通常会使用相对简单的绘图命令(填充/填写矩形,图纸文本)影响大量像素的事实。,绘画小位图等)。
在许多情况下,这些技术以各种方式合并以实现最高性能。
如果您想使用这类技术,则需要做的不仅仅是在堆栈溢出上问一个问题。提供有关这些技术的广泛文档和教程,远远超出了本网站的范围。您需要自己研究它们,甚至更好地使用现有的实现来实现您的目标。