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

标签 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# 中工作。

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

如有任何帮助/建议,我们将不胜感激

最佳答案

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

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

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

也许使用 System.Net.WebRequest 类之类的东西会更容易?同样,这在一定程度上取决于您想要解决的问题。

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

关于c# - 通过以太网发送位图,然后再返回(c# 和 c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240766/

相关文章:

c# - 使用 C# 以编程方式创建 Kindle 电子书?

c - 如何获取上次 ungetc 放回到文件中的字符*

java - BluetoothServerSocket 不从 accept() 返回

c# - 在配置文件中使用引号作为值

c# - 将属性从模型复制回对象——显式复制还是迭代属性集合?

c - 将指针传递给不符合形式参数要求的函数

c - 编写一个包含三个函数的程序,从 main 中调用第一个函数

sockets - 使用 S22 ImapClient 接收 Gmail 电子邮件时,尝试对无法访问的网络进行套接字操作 [2a00:1450:4013:c01::6d]:993

sockets - 原始套接字未收到 icmp 响应

c# - 创建字典<string, class>