none
关于wince下图像数据传输的问题 对于缓冲区中的图像数据,应该如何进行传输和接收?在接收后又应如何进行图像的显示。 急~~ RRS feed

  • 问题

  • 我是使用摄像头获取一帧图像,使用的是eboxII,CE5.0,evc4.0+SP2
    已经通过DeviceIOControl从摄像头上获得了当前拍摄的一帧图像(存储在一个unsigned char*类型的缓冲区中),并且在从YUV转换为RGB后本地显示正常。接下来我试图使用CSocket,通过有连接的套接字将这帧图像传输到用网线连接的一台笔记本上。即,发送端建立套接字并监听,接收端进行Connect。我对数据的传输不是很熟悉,编写的没什么把握。

    现在,字符串的传输我经过调试已经完全正常。可是当我进行图像数据的发送,接收和显示时出了问题,笔记本端既不现实任何图像,跟踪调试程序也不能观察到我需要看到的变量值,比如一些起计数器作用的整型变量都不显示。而且有时运行程序时还会死机。


    因此,请教大家,对于缓冲区中的图像数据,应该如何进行传输和接收?在接收后又应如何进行图像的显示。注:使用的是C++ mfc应用程序。


    请大家不吝解答,如方便请给出相应的代码,在这儿先谢过了
    我编写的发送端的发送和本地显示的代码如下:
             PBYTE data = pBmpData;//获得的图像数据在这个缓冲区中,大小为230400字节,本地显示正常
     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();//使用后释放资源

    2007年12月25日 5:38

答案

  • 这是一个纯TCP/IP网络传输问题

    第一、需要确认的是,你采用的是TCP还是UDP协议,如果是UDP必须处理中途传输失败的问题。

    第二、一次发送的数据数,一般网络的最大传输单元为1460个字节,所以建议一次发送的数据1024左右就可以了,否则底层一样会分包。

    第三、这是我IOEServer中的代码,感觉的你的发送指令也没有什么问题。

    long CTCPClient:Tongue TiedendData(BYTE *arrSend,long size)
    {
       try
       {
      if(send(m_hSocket,(const char *)arrSend,size,0)==SOCKET_ERROR)
      {
       return WSAGetLastError();
      }
      return 0;
     }
     catch(...)
     {
      return 2;
     }
    }

    你需要确认的是网络是否建立(不知道wince平台是客户端还是服务端),此外传输的数据是否完整,否则在还原为图像的时候会有问题。

     

    2007年12月30日 5:32
    版主