我在上一个关于如何发送图像的问题中得到了帮助。 完成的工作是首先发送图像的长度(大小),然后发送实际的图像,然后知道它何时完成。
IT看起来像这样:
BinaryWriter writer = new BinaryWriter(netStream);
while (someCondition) {
Image img = SomeImage();
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
byte[] buffer = new byte[ms.Length];
ms.Seek(0, SeekOrigin.Begin);
ms.Read(buffer, 0, buffer.Length);
writer.Write(buffer.Length);
writer.Write(buffer);
此代码来自:Angelo Geels,他在我之前的问题中帮助了我。
现在,我尝试以某种方式优化它。好吧,它有效。但只有当文件是bmp(未压缩)时,我才知道原因。
using (MemoryStream ms = PrintWindow(process))
{
writer.Write((int)ms.Length);
writer.Write(ms.GetBuffer());
}
所以PrintWindow将图像保存到内存流并返回它。所以ms =内存流,其中包含我的图像。
所以对我而言,这应该是完美的,因为我可以做同样的事情。
我发送文件的大小(内存流的长度)。 然后我在内存流中发送byte []数据。
所以,这是一回事。
但是,它只适用于bmp。
我唯一能想到的是,当我以压缩格式保存时,首先编写bmp然后进行编码,这会弄乱getbuffer()或其他东西。
但我仍然认为它应该有用。
答案 0 :(得分:3)
你写了太多字节,使用Write()重载,你可以指定写入多少:
using (MemoryStream ms = PrintWindow(process)) {
writer.Write((int)ms.Length);
writer.Write(ms.GetBuffer(), 0, (int)ms.Length);
}
答案 1 :(得分:2)
不要使用GetBuffer。来自文档:
请注意,缓冲区包含可能未使用的已分配字节。 例如,如果字符串“test”被写入MemoryStream 对象,从GetBuffer返回的缓冲区的长度是256,而不是 4,未使用252字节。要仅获取缓冲区中的数据,请使用 ToArray方法;但是,ToArray会在其中创建数据的副本 存储器中。
使用:
writer.Write(ms.ToArray());
或者如果你在4.0中使用CopyTo方法:
ms.CopyTo(netStream);
如果您不在4.0中以复制流的方式,请检查此项: How do I copy the contents of one stream to another?