0

我在上一个关于如何发送图像的问题中获得了帮助。所做的事情是首先发送图像的长度(大小),然后发送实际图像,然后它会知道何时完成。

它看起来像这样:

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 = memorystream 里面有我的图像。

所以对我来说,这应该可以完美地工作,因为我可以做同样的事情。

我发送文件的大小(内存流的长度)。然后我在内存流中发送 byte[] 数据。

所以,是一样的。

但是,它只适用于 bmp。

我唯一能想到的是,当我以压缩格式保存时,首先写入 bmp 然后编码,这会弄乱 getbuffer() 或其他东西。

但我仍然认为它应该工作。

4

2 回答 2

3

你写了太多字节,使用 Write() 重载,让你指定要写多少:

    using (MemoryStream ms = PrintWindow(process)) {
        writer.Write((int)ms.Length);
        writer.Write(ms.GetBuffer(), 0, (int)ms.Length);
    }
于 2013-08-06T04:58:20.000 回答
2

不要使用 GetBuffer。从文档中:

请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串“test”写入 MemoryStream 对象,则从 GetBuffer 返回的缓冲区长度为 256,而不是 4,其中 252 个字节未使用。要仅获取缓冲区中的数据,请使用 ToArray 方法;但是,ToArray 会在内存中创建数据的副本。

利用:

 writer.Write(ms.ToArray());

或者,如果您在 4.0 中,请使用 CopyTo 方法:

 ms.CopyTo(netStream);

如果您不在 4.0 中,请检查此项以获取复制流的方法: 如何将一个流的内容复制到另一个流?

于 2013-08-06T04:25:47.277 回答