截图未完全转移

时间:2014-04-29 09:10:22

标签: c# image file

我的程序现在是从一个copmuter发送一个屏幕截图到另一个,但img看起来像在reciving方面的结果:

http://i.stack.imgur.com/gyCIA.jpg

Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight);
                  Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
                  gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
                  bmpScreenShot.Save("pic.jpg", ImageFormat.Jpeg);
                  MemoryStream ms = new MemoryStream();
                  bmpScreenShot.Save(ms, ImageFormat.Jpeg);
                  bmpbyte = ms.ToArray();

                  bmpScreenShot.Dispose();
                  ms.Close();
                  ///////////////////////////
                  Send_Text("" + screenHeight);
                  textBox3.Text += ("\r\nSending Hight=" + screenHeight);
                  Send_Text("" + screenWidth);
                  textBox3.Text += ("\r\nSending Width=" + screenWidth);
                  System.Threading.Thread.Sleep(200);
                  Send_Text("" + bmpbyte.Length);
                  textBox3.Text += ("\r\nSending size of:" + bmpbyte.Length);

                  textBox3.Text += "\r\nTransmiting the Screenshot";
                  stm.Write(bmpbyte, 0, bmpbyte.Length);
                  textBox3.Text += "\r\nSent IMG :)";

顶部的代码是客户端 我发送图片的大小(高度和宽度和数组长度),它正确传输 但正如我所说的服务器有令人失望的完整图片

textBox2.Text += "\r\n Getting h";
            byte[] buffer = new byte[320];
            s.Receive(buffer);
            string str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
            Array.Clear(buffer, 0, buffer.Length);
            int h = int.Parse(str);
            textBox2.Text += "="+h+"\r\n Getting w";
            s.Receive(buffer);
             str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
             Array.Clear(buffer, 0, buffer.Length);
             int w = int.Parse(str);
            textBox2.Text += "="+w+"\r\n Getting p";
            s.Receive(buffer);
            str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
            Array.Clear(buffer, 0, buffer.Length);
            int p = int.Parse(str);
            textBox2.Text += "=" + p;
            byte[] asd = new byte[p];
            Bitmap cc = new Bitmap(h, w);


            s.Receive(asd);

            MemoryStream ms = new MemoryStream(asd);

            Image bmp = Image.FromStream(ms);
            bmp.Save("End.jpg", ImageFormat.Jpeg);
            pictureBox1.Image = bmp;

请注意,未定义的内容将在代码中的某些位置进行定义 并且文本框行仅用于用户界面 还有一件事我是使用localhost \ local网络而且都是tcp

1 个答案:

答案 0 :(得分:3)

您没有告诉我们如何您发送信息(通过网络?串行?TCP?),但是从您的代码我可以看到一件事:

您确实收到了要等待的实际字节数,但您不是在等待实际的字节数。

byte[] asd = new byte[p];
s.Receive(asd);

这个 创建一个足够大的字节数组来保存所有字节,但s.Receive(asd)真的接收到所有字节吗?


在您编辑了问题后,让我澄清一件事:TCP通信可能会碎片化。仅仅因为你一次发送4000个字节并不能保证接收器一次接收4000个字节。他可能不会。这就是Receive方法返回实际接收的字节数的原因。

那么接收者需要做的就是这个(伪代码):

int totalBytesRead = 0;

do
{
    int bytesRead = s.Receive(buffer);
    totalBytesRead += bytesRead;

    if (bytesRead == 0)
    {
        // Stream was closed - no more bytes
        break;
    }
    else
    {
        // Write bytesRead bytes from buffer to memory stream
    }
}
while (totalBytesRead < expectedNumberOfBytes);

if (totalBytesRead < expectedNumberOfBytes)
    throw new Exception("Premature end of transmission");

实际上,再次思考并查看代码时,我注意到您实际上正在向接收方发送 JPEG 字节。接收方的未初始化缓冲区应该是有效的JPEG,这是非常不可能的。

所以虽然以上所有内容仍然属实,但我现在怀疑接收器实际上是一个做错的人。现在看来,将字节保存到内存流中无法正常工作。

我从您的代码中看到,您将图像保存到文件和内存流中。 文件是否包含有效图片?如果不是,您需要查找未正确创建屏幕截图的原因。如果图片有效,您可以尝试另外两件事:

  1. 从文件中读取JPEG字节,而不是创建内存流
  2. 在将字节发送到客户端之前不要丢弃内存流,但在此之后
  3. 有关SO的问题表明,在将图像保存到内存流并从流中获取字节时,时序似乎是一个问题。有时它不起作用。