C# 通过ZeroMQ套接字发送Pillow/numpy映像

C# 通过ZeroMQ套接字发送Pillow/numpy映像,c#,python,arrays,json,numpy,C#,Python,Arrays,Json,Numpy,我需要获取一个枕头图像,然后将其转换为字节数组,或者以某种方式将其打包,以便通过ZeroMQ套接字发送。因为另一个套接字连接不是python(它是c#),所以我不能使用pickle,我也不确定JSON是否可以工作,因为它只是一个映像(维度单独发送)。我正在使用从opencv中处理的numpy数组创建的图像,因此我没有图像文件。发送numpy数组也不起作用 因为我无法从文件中读取图像字节,所以我尝试了image.getdata()和image.tobytes(),但我不确定它们是否以正确的形式通过

我需要获取一个枕头图像,然后将其转换为字节数组,或者以某种方式将其打包,以便通过ZeroMQ套接字发送。因为另一个套接字连接不是python(它是c#),所以我不能使用
pickle
,我也不确定JSON是否可以工作,因为它只是一个映像(维度单独发送)。我正在使用从
opencv
中处理的
numpy
数组创建的图像,因此我没有图像文件。发送
numpy
数组也不起作用

因为我无法从文件中读取图像字节,所以我尝试了
image.getdata()
image.tobytes()
,但我不确定它们是否以正确的形式通过套接字发送。我真正需要的是一个ByTestStream,我可以在穿过套接字后将其转换为一个数组

更新:所以现在我特别寻找在C#中容易撤销的东西。我已经研究了
struct.pack
,但我不确定是否有一个等价物可以将其解包。只要我能解码,就可以将图像转换成编码字符串


更新2:我想我可以使用JSON发送一个多维数组,然后在另一侧获取JSON并将其转换为位图来显示。不过,我在C#端使用clrzmq,我不确定它是如何处理JSON对象的。

如果有人想知道,我最后做了以下几点:

在python方面:

_, buffer = cv2.imencode('.jpg', cFrame ) 
jpg_enc = base64.b64encode(buffer).decode('utf-8')

self.frameSender.send_string(jpg_enc)
self.frameSender.send_string(str(height))
self.frameSender.send_string(str(width))
在C侧:


发送字节数组效率很低。考虑一下图像的尺寸,认识到1080p图像是6MB的。你真的希望发送像视频这样的连续帧吗?因为如果你发送的是30fps,那么你的带宽就会突然超过千兆以太网的带宽。您考虑过发送JPEG吗?您可以在这里查看一种将图像(Numpy数组)存储到Redis的方法,您可以使用ZeroMQ执行类似的操作@Mark我没有——我希望避免保存图像和重新加载它们,因为插槽在同一个EEPROM机器上是进程间的,我不想耗尽内存。如果有一种方法可以创建一个jpeg图像而不将其保存到文件中,那就行了。如果我保存了图像,我只需在C#端重新加载它,并在应用程序的这一部分中完全放弃套接字。当然,只需创建
BytesIO
并写入其中。。。查看注释开始后的3行
#Encode…
查看redis对另一个问题的回答,我看到您使用带密钥的struct.pack--我是否必须使用c中的直接等价物来解包数组?只要我能得到一个字节数组放入memorystream,我就能得到一个位图来显示。
byte[] bytebuffer = Convert.FromBase64String(frameListener.ReceiveFrame().ReadString());
int height = int.Parse(frameListener.ReceiveFrame().ReadString());
int width = int.Parse(frameListener.ReceiveFrame().ReadString());
using (MemoryStream ms = new MemoryStream(bytebuffer)) //image data
{
     Bitmap img = new Bitmap(Image.FromStream(ms), new Size(height, width));
     pictureboxVideo.BeginInvoke((MethodInvoker)delegate{pictureboxbVideo.Image = img;});
}