首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

网络传送图片的有关问题~

2012-10-06 
网络传送图片的问题~~首先在服务端把从摄像头获取的图片保存为jpg形式的,然后利用文件传送的方式传到客户

网络传送图片的问题~~
首先在服务端把从摄像头获取的图片保存为jpg形式的,然后利用文件传送的方式传到客户端,但是客户端接收到的信息总是不全,显示图片的时候只会显示前面几行的图像,后面就全都是灰色的了,其实就是文件传输问题,程序贴在下面,请各位大虾帮忙看看~~

UINT _SendFileThread(LPVOID lparam) //这个是发送视频帧的啊~~~
{
  //套接字连接connect
  //先发送个标识f
  CFile myFile;
   
if(myFile.Open(pDlg->m_filename,CFile::modeRead|CFile::typeBinary)) //m_filename图片的名字
{
   
byte* data = new byte[60000]; //图片大小
myFile.ReadHuge(data,60000);
  end=sockClient.Send((char*)data,60000);
delete data;

}

myFile.Close();
CFile::Remove(pDlg->m_filename);//删除文件

sockClient.Close();

return 0;
 
}


客户端接收
{
byte* data1 = new byte[60000]; //图片大小

  int recvfile=recSo.Receive((char*)data1,60000);//接收图像
if(SOCKET_ERROR==recvfile)
{
MessageBox("接收图像错误");
return -1;
}
else 
{
CFile destFile;
char str[10];
_itoa(num,str,10); //int和char类型转换
num++;
CString filename = str;
filename+="b.jpg";

if(destFile.Open(filename,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
{
destFile.WriteHuge(data1,recvfile);
}

destFile.Close();
delete data1;
//在控件上显示图片

CFile::Remove(filename);


return 0;
}

}
补充说明的就是 服务端是设置了定时器来采集图像的,setTimer(1,400,NULL)
谢谢各位了,不知道什么原因啊,tcp传输,因为还有数据要传 所以用了tcp传输~~~

[解决办法]
nt recvfile=recSo.Receive((char*)data1,60000);//接收图像
图像中黑色的部分(0x00)会被认做是'\0',所以图像信息没有取全.
楼主如果不想改代码的话,可以给图像数据加1,在接收时减去1即可
[解决办法]
lz的这段代码


byte* data = new byte[60000]; //图片大小
myFile.ReadHuge(data,60000);
end=sockClient.Send((char*)data,60000);
delete data;

end返回的应该是send了多少字节吧,第一次不可能一下就返回60000,
也就是说你要循环发送

这样写比较好

int nLast = 60000;
int index = 0;

while (nLast > 0)
{
int ret = sockClient.Send((char*)data + index,nLast);

nLast -= ret;
index += ret;
}

还有你一下子把一张图片读进来到一个数组中,这种做法不太好(个人觉得)

应该用一个小一点的数组分步读,分步send。


[解决办法]

探讨
lz的这段代码


byte* data = new byte[60000]; //图片大小
myFile.ReadHuge(data,60000);
end=sockClient.Send((char*)data,60000);
delete data;

end返回的应该是send了多少字节吧,第一次不可能一下就返回60000,
也就是说你要循环发送

这样写……

[解决办法]
探讨
nt recvfile=recSo.Receive((char*)data1,60000);//接收图像
图像中黑色的部分(0x00)会被认做是'\0',所以图像信息没有取全.
楼主如果不想改代码的话,可以给图像数据加1,在接收时减去1即可

热点排行