0

我有一个文件传输程序。程序(客户端)执行以下操作以通过 TCP 套接字发送位图:获取屏幕截图 ->从内存中获取位图-> 转换为流 -> 发送

        MemoryStream Fs = new MemoryStream();

//////////////11111
        Bitmap bmp = TakeScreen();

///////////////2222
        //Bitmap bmp = new Bitmap(@"C:\temp\001.bmp");


        bmp.Save(Fs, ImageFormat.Bmp);
        Byte[] buffer = Fs.ToArray();

        Fs.Read(buffer, 0, buffer.Length);
        TcpClient socket = new TcpClient("192.168.0.131", 1095);

        NetworkStream nw = socket.GetStream();
        nw.Write(buffer, 0, buffer.Length);
        nw.Close();
        Fs.Dispose();
        socket.Close();
        bmp.Dispose();
  • 如果我选择直接从内存中传输图像 - 没有错误。

  • 如果我尝试先从文件加载位图 - 在服务器端出现“参数无效”错误。

这是服务器端:

                    NetworkStream Nw = new NetworkStream(handlerSocket.Client);
                    int thisRead = 0;
                    int Blocksize = 1024;
                    Byte[] dataByte = new Byte[Blocksize];

                    Bitmap screen = getScreen(Nw, dataByte, thisRead, Blocksize);
                    Nw.Close();

   private Bitmap getScreen(NetworkStream Nw, Byte[] dataByte, int thisRead, int Blocksize)
    {
        Bitmap bitmap;
        using (var strm = new MemoryStream())
        {

            while (true)
            {
                thisRead = Nw.Read(dataByte, 0, Blocksize);
                strm.Write(dataByte, 0, thisRead);
                if (thisRead == 0)
                    break;
            }

            bitmap = new Bitmap(strm); // Error here
        }
        Bitmap bm3 = new Bitmap(bitmap);
        bitmap.Dispose();
        return bm3;
    }

是什么导致了这个错误?我想这与 MemoryStream 有关。

编辑:简化问题

4

1 回答 1

1

您需要先搜索到流的开头,然后才能创建Bitmapin getScreen

private Bitmap getScreen(NetworkStream Nw, Byte[] dataByte, int thisRead, int Blocksize)
{
    Bitmap bitmap;
    using (var strm = new MemoryStream())
    {
        while (true)
        {
            thisRead = Nw.Read(dataByte, 0, Blocksize);
            strm.Write(dataByte, 0, thisRead);
            if (thisRead == 0)
               break;
        }

        stream.Seek(0, SeekOrigin.Begin; // <-- Go Back to beginning of stream
        bitmap = new Bitmap(strm); // Error here
    }
    Bitmap bm3 = new Bitmap(bitmap);
    bitmap.Dispose();
    return bm3;
}

EDIT
详细说明: 将最后一个字节写入流后,流的当前位置是流的结尾。现在从屏幕创建 aBitmap会尝试从流中读取位图,但这不起作用,因为在当前位置(= 流的结尾)之后没有更多数据。

所以你需要做的是告诉流将当前位置设置回流的开头。然后,可以读取位图信息。

于 2012-04-04T09:59:47.047 回答