如题.(Winform程序)接收图片的代码如下:
        private void button1_Click(object sender, EventArgs e)
        {            //设置接收数据缓冲区的大小
            byte[] b = new byte[2000001];
            System.Net.Sockets.Socket hostsocket = receivesocket.Accept();
            //如何确定该数组大小 
            System.IO.MemoryStream fs = new System.IO.MemoryStream();
            //接收数据
            hostsocket.Receive(b);
            fs.Write(b, 0, b.Length);
            Bitmap Img = new Bitmap(fs);
            pictureBox1.Image = Img;               
           //关闭写文件流
            fs.Close();
            //关闭接收数据的Socket
            hostsocket.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
            hostsocket.Close();
        }总是在执行到" Bitmap Img = new Bitmap(fs);"这句的时候,出现错误提示--------GDI+ 中发生一般性错误.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
谢谢.

解决方案 »

  1.   

    可是我在发送端截取的是完整的图象.但接收完了在picturebox上显示的是黑屏.这是为什么呢
      

  2.   

    是不是我在客户端只是截屏显示了,但是根本就没有传递到接收端???发送端截屏和传输代码如下:
      private void button1_Click(object sender, EventArgs e)
            {
                //***************************************************************************************截屏*********************************************************//
                    this.Hide();
                    IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
                    //创建显示器的DC   
                    Graphics g1 = Graphics.FromHdc(dc1);
                    //由一个指定设备的句柄创建一个新的Graphics对象   
                    Bitmap MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
                    //根据屏幕大小创建一个与之相同大小的Bitmap对象   
                    Graphics g2 = Graphics.FromImage(MyImage);
                    //获得屏幕的句柄   
                    IntPtr dc3 = g1.GetHdc();
                    //获得位图的句柄   
                    IntPtr dc2 = g2.GetHdc();
                    //把当前屏幕捕获到位图对象中   
                    BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);
                    //把当前屏幕拷贝到位图中   
                    g1.ReleaseHdc(dc3);
                    //释放屏幕句柄   
                    g2.ReleaseHdc(dc2);
                    //释放位图句柄   
                    MyImage.Save("d:\\新建文件夹\\MyJpeg.jpg", ImageFormat.Jpeg);  //当然你也可以根据自己的需要,把屏幕以其他图片的格式来保存,如果你想把图片保存为位图文件,可以把"ImageFormat.Jpeg"改换成"ImageFormat.Bmp";想把图片保存为Gif文件,就把"ImageFormat.Jpeg"改换成"ImageFormat.Gif"。你可以保存的文件类型大概有十多种,这里就不一一介绍了,当然你也要相应改变保存文件的后缀。
                    pictureBox1.Image = MyImage;
                    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;   //本程序所用控件为1个按狃,一个panel,一个picturebox,其中panel的属性Autoscroll =true; picturebox的属性SizeMode =AutoSize; 然后只要改变pictureBox的大小,图象就会跟着改变大小,如果把这句去掉的话,就可以实现图象按panel滚动条移动而查看全图。                // MessageBox.Show("已经把当前屏幕保存到D:\\MyJpeg.jpg文件中!");
                    this.Show();
                    //***************************************************************************************开始使用socket发送文件*********************************************************//
                  
                    //建立终结点 
                    System.IO.MemoryStream Stream = new System.IO.MemoryStream();
                    pictureBox1.Image.Save(Stream, System.Drawing.Imaging.ImageFormat.Bmp);//存储为bmp图象
                  //  pictureBox1.Image.Save(Stream, System.Drawing.Imaging.ImageFormat.Jpeg);   //不想存储为bmp图象,想存储为jpeg图象
                    byte[] b = Stream.ToArray();                 
                    //连接远程计算机 
                    sendsocket.Send(b);
                    //发送                 Stream.Close();
                    sendsocket.Shutdown(System.Net.Sockets.SocketShutdown.Send);
                    //关闭发送连接 
                    sendsocket.Close();            //关闭本                 //***********************************************************************************************************end*******************************************************//
              }        
      

  3.   

    1. 你确定你的图片接受完了么?
    你的buffer大小是2000001,如果图片大于这么多,你的图片肯定收不完。
    你应该在杰和艘图片的时候加一个while2. 接受完图片之后,加载图片之前,最好把fs Seek到Stream最开头
      

  4.   

    1. 你确定你的图片接受完了么? 
    你的buffer大小是2000001,如果图片大于这么多,你的图片肯定收不完。 
    你应该在杰和艘图片的时候加一个while ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    谢谢楼上,怎么加,我不会(脸红ing)
      

  5.   

    谢谢楼上,我把buffer大小改成byte[] b = new byte[600000000]还是不行.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    楼上,加一个while,怎么加啊,我不会(脸红ing)
      

  6.   

    我把while循环加入后,又出现下列提示:
    引发类型为"System.OutOfMemoryException"的异常
    代码如下:
     private void button1_Click(object sender, EventArgs e)
            {
                this.label2.Text = "图象正在传输中,请稍侯";
                //设置接收数据缓冲区的大小
                byte[] b = new byte[600000000];
                System.Net.Sockets.Socket hostsocket = receivesocket.Accept();
                //如何确定该数组大小 
                System.IO.MemoryStream fs = new System.IO.MemoryStream();
                          int got = 0;
                int datalength = 0;
                do
                {
                    got =hostsocket.Receive(b);
                    fs.Write(b, 0, b.Length);                
                    datalength = datalength + got;
                }
                while ((got == 600000000));
                Bitmap Img = new Bitmap(fs);
                pictureBox1.Image = Img;
                Img.Save("e:\\MyJpeg.jpg", ImageFormat.Jpeg);
                // this.Image1.ImageUrl = @"e:\MyJpeg.jpg";
                //关闭写文件流
                fs.Close();
                //关闭接收数据的Socket
                hostsocket.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
                hostsocket.Close();
                this.label2.Text = "图象传输完毕";
            }
      

  7.   

    汗?
    你这样循环当然OutOfMemory阿。
    int got = 0;
    int datalength = 0;
    while(got > 0)
    {
        got = hostsocket.Receive(b);
        fs.Write(b, 0, got);               
        datalength = datalength + got;
      

  8.   

    谢谢楼上.并祝各位感恩节快乐.
    楼上,按照你那样我改了循环代码,但是执行到 -------Bitmap Img = new Bitmap(fs);-------时,提示"参数无效" private void button1_Click(object sender, EventArgs e)
            {
               this.label2.Text = "图象正在传输中,请稍侯";
                //设置接收数据缓冲区的大小 
                byte[] b = new byte[600000000];
                System.Net.Sockets.Socket hostsocket = receivesocket.Accept();
                //如何确定该数组大小 
                System.IO.MemoryStream fs = new System.IO.MemoryStream();
                int got = 0;
                int datalength = 0;
                while (got > 0)
                {
                    got = hostsocket.Receive(b);
                    fs.Write(b, 0, got);
                    datalength = datalength + got;
                } 
                Bitmap Img = new Bitmap(fs);
                pictureBox1.Image = Img;
                Img.Save("e:\\MyJpeg.jpg", ImageFormat.Jpeg);
                // this.Image1.ImageUrl = @"e:\MyJpeg.jpg"; 
                //关闭写文件流 
                fs.Close();
                //关闭接收数据的Socket 
                hostsocket.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
                hostsocket.Close();
                this.label2.Text = "图象传输完毕"; 
            }
      

  9.   

    while (got > 0) 
                { 
                    got = hostsocket.Receive(b); 
                    fs.Write(b, 0, got); 
                    datalength = datalength + got; 
                } 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    我用断点跟踪,这段代码好象没执行,系统直接跳过了
      

  10.   

    改成
    while (got >= 0) 
                { 
                    got = hostsocket.Receive(b); 
                    fs.Write(b, 0, got); 
                    datalength = datalength + got; 
                } 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    就循环执行了,但是循环了N次之后,出现下列提示
    ~~~~~~~~~~~~~~~~~~~由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作
      

  11.   

    同志们,好了,好了,问题解决了,代码改成这样了            int got = 0;
                int datalength = 0;
               
               while(true)   
                {   
                  got = hostsocket.Receive(b);
                   fs.Write(b, 0, got);
                  if(got>0)   
                      datalength = datalength + got;
                else   
                     break;     
               }
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~今天是感恩节,给我带来了好运,感恩的心,阿门!呵呵.
    感谢IE,感谢微软,感谢socket,感谢.net,感谢楼上的各位,(特别关注奖颁发给:jzywh---江大鱼同志,thank you),并祝大家好运.