Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过以太网发送位图,然后再发送回来(c和c)_C#_C_Sockets_Tcp_Bitmap - Fatal编程技术网

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

C# 通过以太网发送位图,然后再发送回来(c和c),c#,c,sockets,tcp,bitmap,C#,C,Sockets,Tcp,Bitmap,我希望通过以太网发送位图或图像,以便执行一些图像处理,然后将它们发送回。 “客户端”正在运行c代码,使用emgucv从视频中提取帧。“服务器”将在arm cpu上运行c/c++,尽管目前我的笔记本电脑上使用的是x86操作系统。因此,我需要避免在图像处理本身中使用类似opencv的东西,但这是另一点 我查看了套接字等,可以将一些数据发送到服务器或从服务器发送数据,目前只需在控制台中键入文本即可 从最初的研究来看,我似乎需要将位图转换为字节数组,然后才能发送它,我已经这样做了,我想使用以下代码: S

我希望通过以太网发送位图或图像,以便执行一些图像处理,然后将它们发送回。 “客户端”正在运行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上编写过代码,所以我缺少了intellisense/debug之类的东西


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

是的,简而言之,我想说的是,您做自己想做的事情的方法是正确的

但我会问,为什么要将其发送到服务器?我猜这和并行处理或其他什么有关?除非您正在进行非常繁重的处理,否则使用单个帧可能比将其传输到服务器要快。据我所知,C中的EmguCV并不比C/C++中的OpenCV慢多少

Stame.Duto.BITMAP类是.NETFramework的一部分,您可能找不到在C.中的直接对应。您可能需要考虑首先将图像转换为一些已知的格式,例如.pNG文件。然后发送该文件的原始字节。在服务器端,您接收原始字节数组,并使用任何C结构将该图像作为.png文件加载。关键是要消除一些抽象,并对发送的内容有更精确的了解

也许使用System.Net.WebRequest类会更容易些?同样,这在一定程度上取决于您正试图解决的问题


我希望这能有所帮助-这个回答有点含糊您的问题也是:p,所以请随时询问具体部分的说明:

printf%s。。。仅适用于以null结尾的字符串。部分接收的位图缓冲器不是空结尾的字符串。Bitmaps在.NET中与非托管C++中的工作方式相同,从某种意义上说,格式实际上是普通文件格式,即当您保存到内存流时,这是与保存到文件时所得到的相同的精确数据。因此,您需要找到一个示例,说明如何在服务器端将数据解释为Windows.bmp格式。不管怎样,您可能应该使用.png,因为它是压缩的,但仍然是无损的,而且您在Linux上对.png的支持可能比对.bmp更好,但实际上,.bmp也是非常广泛的支持。当我第一次设置客户端和服务器之间的通信时,printf就在那里,只是发送一个字符串。我不想打印它,我想在发回之前进行一些图像处理。关于PNG很公平,使用PNG编辑像素值等是否比使用BMP更容易?对于插值、边缘检测等,OP使用ImageFormat.Bmp,这是一个普通的.Bmp文件。它不是特定于.NET的格式。png会更好,因为它是压缩的,但对于接收代码来说,两者都同样有效。它被发送到带有FPGA的开发板上尝试使用,但首先它将在板上的arm芯片上运行。因为我想执行一些图像处理插值,边缘检测,可能一些运动的东西,为了实现某种形式的超分辨率,我想我想避免压缩图像。编辑:刚刚看到PNG是无损和压缩的,我可能会研究它们,它们是否更容易处理,改变像素值等?不,它们只是占用更少的空间。您要做的是将其压缩为PNG,然后发送,并在处理之前在另一端对其进行解压缩。足够公平,带有memorystream的注释代码看起来正确吗?目的是在发送回图像之前,将图像或类似内容反转。要将它发送回去,我会使用最初发送它时使用的代码吗?MemoryStream代码看起来不错,但在测试之前,我不会说它肯定会工作。你试过运行它看看它是否有效吗?您可以使用相同的方法发送bac K