我试图尽快将图像发送到套接字试图压缩...比较图像......它仍然工作得很慢...... 顺便说一下,我试图在压缩前后保存图像,尺寸相同...... 1或2 kb ......
查看客户端代码:
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并没有将图像保存为流......你们可以解释一下这些区别吗?并建议我的代码有什么问题,如何改进我的算法?
答案 0 :(得分:1)
你的问题实际上是将“太宽泛”作为一个接近的理由来推动极限。通过网络发送图像数据的一般问题是一个非常广泛的研究领域,有大量不同的技术,具体的应用/用户场景决定了哪种技术最佳。
也就是说,根据瓶颈所在的位置,您可以对所需的代码进行一次非常明显的更改,可能加快哪些代码。
具体来说,您使用ImageConverter.ConvertTo()
将Bitmap
对象转换为byte[]
,然后使用GzipStream
来压缩该字节数组。这个问题是ConvertTo()
已经压缩了数据;它返回的byte[]
包含表示为PNG格式的原始位图,这是一种相当不错的无损压缩算法。
因此,不仅压缩它几乎不会实现任何目的,它会花费你很多CPU来做任何事情。不要那样做。只需按原样发送byte[]
数据,而无需通过GzipStream
运行。
现在,所有这一切......
正如我所提到的,这种变化是否真的有助于这一切取决于其他因素,包括位图的大小,以及您使用的网络速度有多快。如果你已经在你的问题中发布的效率低下的代码已经使网络饱和,那么加速代码就没有用了。
用于处理网络带宽作为瓶颈的技术包括(但不限于):
在许多情况下,这些技术以不同的方式组合以实现最佳性能。
如果您想使用这些技术,您需要做的不仅仅是在Stack Overflow上提问。提供有关这些技术的广泛文档和教程远远超出了本网站的范围。您需要自己研究它们,或者甚至更好地使用现有的实现来实现您的目标。