如题.(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+ 中发生一般性错误.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
谢谢.
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+ 中发生一般性错误.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
谢谢.
解决方案 »
- checkboxlist 多选框显示问题,寻求更简单的方法
- 顽固的"无法向会话状态服务器发出会话状态请求"错误! 欲深入探讨ASP.Net状态信息处理机制者入!
- 怎样去掉事件的绑定
- 有谁告诉我 reflector(打开DLL文件的软件) 这软件怎么用呀,我一进这个软件里面就一头雾水
- 什么叫“潜在危险的 Request.Form 值”?
- 怎样调用其他窗体的控件
- AxMSFlexGridLib在.net工具箱里能不能找到这个控件啊,它是什么控件???谢谢
- ASP.net Treeview 期待 你的回答
- C#程序可不可以调用的flash做的东西?如何调用?
- http;//www.xxx.com/xx.csv 这样可以直接下载文件,现在只想让认证过的用户才能下载,怎么做???
- 初学XML,问一下怎么循环生成XML
- 菜鸟发问!
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*******************************************************//
}
你的buffer大小是2000001,如果图片大于这么多,你的图片肯定收不完。
你应该在杰和艘图片的时候加一个while2. 接受完图片之后,加载图片之前,最好把fs Seek到Stream最开头
你的buffer大小是2000001,如果图片大于这么多,你的图片肯定收不完。
你应该在杰和艘图片的时候加一个while ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
谢谢楼上,怎么加,我不会(脸红ing)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
楼上,加一个while,怎么加啊,我不会(脸红ing)
引发类型为"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 = "图象传输完毕";
}
你这样循环当然OutOfMemory阿。
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);-------时,提示"参数无效" 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 = "图象传输完毕";
}
{
got = hostsocket.Receive(b);
fs.Write(b, 0, got);
datalength = datalength + got;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我用断点跟踪,这段代码好象没执行,系统直接跳过了
while (got >= 0)
{
got = hostsocket.Receive(b);
fs.Write(b, 0, got);
datalength = datalength + got;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
就循环执行了,但是循环了N次之后,出现下列提示
~~~~~~~~~~~~~~~~~~~由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作
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),并祝大家好运.