通过以太网发送位图然后再返回(c#和c)

时间:2015-01-30 16:52:43

标签: c# c sockets tcp bitmap

我希望通过以太网发送位图(或图像)以执行某些图像处理,然后将其发回。 '客户'正在运行c#代码,使用emgucv从视频中提取帧。 '服务器'将在arm cpu上运行c / c ++,虽然目前我的笔记本电脑上的x86使用的是基本操作系统。所以我需要避免使用像opencv这样的东西进行图像处理本身,但那是另一个观点。

我查看了套接字等,可以向/从服务器发送一些数据,此时只需将文本输入控制台。

从最初的研究开始,似乎我需要将位图转换为字节数组,然后发送它,我已经完成了(我认为)使用以下代码:

Stream stm = tcpclnt.GetStream();
    int l;
    using (MemoryStream ms = new MemoryStream())
    {
        bmpFrame.Save(ms, ImageFormat.Bmp);
        byte[] byteFrame = ms.ToArray();
        l = byteFrame.Length;

        stm.Write(byteFrame, 0, byteFrame.Length);
        stm.Flush();
    }

然后在服务器端尝试使用以下方法阅读:

char buff[10000];
int n;
n = read(conn_desc, buff, sizeof(buff)-1);
    if ( n > 0)
    {
    //MemoryStream ms = new MemoryStream(receivedBytes);
    //Bitmap bmpReceived = new Bitmap(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        printf("Received %s\n", buff);
    }

   else
    {
        printf("Failed receiving\n");
    }

您可以看到评论代码,我认为我可以将其更改回位图,但我不确定是否需要/需要,如果我可以编辑图像通过直接访问字节,我也不知道位图是如何工作在C而不是C#。

我是否沿着正确的路线走?理想情况下,我想发送一个帧的所有数据,然后对其进行处理,然后将其发送回去,但我不知道这是不是我正在做的事情。发现它比平常更困难,因为在服务器上我只是用scratch / gedit编写并使用gcc进行编译,之前从未在linux上编码,所以我错过了智能感知/调试等事情。

任何帮助/建议都将不胜感激

1 个答案:

答案 0 :(得分:0)

是的,简而言之,我会说你做你想做的事情的方法是正确的。

我会问,为什么要将它发送到服务器?我猜它与并行处理有什么关系?除非您正在进行非常繁重的处理,否则使用单帧可能比将其传输到服务器更快(据我所知,C#中的EmguCV并不比C / C ++中的OpenCV慢得多)。

System.Drawing.Bitmap类是.Net框架的一部分,您可能在C中找不到直接对应。您可能要考虑首先将图像转换为某种已知格式,例如.png文件。然后发送该文件的原始字节。在服务器端,您将收到原始字节数组,并使用任何C结构将该图像作为.png文件加载。重点是删除一些抽象,并准确了解正在发送的内容。

也许它更容易使用像System.Net.WebRequest类这样的东西?同样,这取决于您正在尝试解决的问题。

我希望这有点帮助 - 这个回答有点模糊(你的问题也是:P),所以请随时要求澄清具体部分:)