我使用的是eboxII,CE5.0,evc4.0+SP2
已经通过DeviceIOControl从摄像头上获得了当前拍摄的一帧图像(存储在一个unsigned char*类型的缓冲区中),并且在从YUV转换为RGB后本地显示正常。接下来我试图使用CSocket,通过有连接的套接字将这帧图像传输到用网线连接的一台笔记本上。
现在,字符串的传输我经过调试已经完全正常。可是当我进行图像数据的发送,接收和显示时出了问题,笔记本端既不现实任何图像,跟踪调试程序也不能观察到我需要看到的变量值,比如一些起计数器作用的整型变量都不显示。而且有时运行程序时还会死机。
因此,请教大家,对于缓冲区中的图像数据,应该如何进行传输和接收?在接收后又应如何进行图像的显示。注:使用的是evc下的mfc应用程序。
请大家不吝解答,如方便请给出相应的代码,在这儿先谢过了
我编写的ebox端的发送和本地显示的代码如下:
PBYTE data = pBmpData;//获得的图像数据在这个缓冲区中,大小为2304字节,本地显示正常
unsigned char* send = (unsigned char*)malloc(2304);//我试图每次发送2304字节,不知这样能实现否
PBYTE shit = send;
long int num=0;
int i=0;
CString inf;
while(num<230400)
{
memmove(shit,data,2304);
data+=2304;
num+=2304; //发送,不知是否能够实现,问题应该就出在这块
m_socketSend.Send(send,2304,0); //但我没想出还可以怎样实现,请教大家
}
inf.Format(L"%ld Bytes sent!",num);
AfxMessageBox(inf);
//显示出来
CBitmap bitmap;
bitmap.CreateBitmap(320,240,1,24,pBmpData);//创建位图
CWnd* pWnd=GetDlgItem(IDC_REMOTEVIDEO);//这个控件为picture control
pWnd->UpdateWindow();
CDC* pDC=pWnd->GetDC();//获得当前控件的设备上下文
CDC bitmapDC;
bitmapDC.CreateCompatibleDC(pDC);//创建与设备适配的设备上下文
CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);//加载位图
pDC->BitBlt(0,0,320,240,&bitmapDC,0,0,SRCCOPY);//拷贝到当前的设备上下文中
bitmapDC.SelectObject(pOldBitmap);
bitmapDC.DeleteDC();
bitmap.DeleteObject();//使用后释放资源
------解决方案--------------------
数据传输没有协议也可以? 根据协议来做吧。
while(num <230400)
{
memmove(shit,data,2304);
data+=2304;
num+=2304;
m_socketSend.Send(send,2304,0); //也不知道是不是发送成功了,就接着发送了。也不知道你的Socket程序是否有问题。
}
------解决方案--------------------
简单的数据传输这样没问题的,我现在的疑问是,你的图片拆开,然后送过去,应该在接受端开个缓存的吧,你说你的笔记本会死机,很有可能是数据没有接受完全,然后运行会造成溢出,没看到你的接受端代码,只能猜测,,,
------解决方案--------------------
接收端和发送端的接收缓冲区和发送缓冲区都是多大,不会比2304小吧。
是否有丢失数据的可能。
------解决方案--------------------
你每次接受完和传送完数据,把字符串用memset清空下试试看