python中的JPG编码通过socket发送到C#和decod

2024-04-20 10:02:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把经过处理的图像从python后端发送到C#前端。 所以我用JPG编码器编码并发送。在

当我接收到它并使用C#中的JPEG解码器解码它时,它会抛出异常。其中接收字节的大小等于编码后发送的字节。在

有人能告诉我如何解码和显示这个图像吗。在

Python服务器端编码图像JPG的代码

while True:
    conn, addr = s.accept()
    print ('connected to : ' + addr[0] +" :"+ str(addr[1])) 

    vidcap = cv2.VideoCapture(videoPath)
    total_frames = int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT))
    conn.setblocking(0)
    for mm in range(0,total_frames ,1):
       try:
           dataClient = str(conn.recv(4096).decode('UTF-8'))
           conn.send(str.encode(dataClient))   
           conn.close()
           kk=2
           break
       except socket.error:

           ret,img= vidcap.read()
           image = cv2.resize(img, (640, 480)) 
           #############################################
           encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),100]
           result,enData=cv2.imencode('.jpg',image,encode_param)
           conn.send(enData)
           #############################################

客户端解码图像JPG中的C代码

^{pr2}$

Exception


Tags: 代码图像编码frames字节conn解码cv2
2条回答
MemoryStream ms = new MemoryStream(bytesRead); // bytesRead = int, number of bytes received

这行代码创建一个空的内存流,初始容量为bytesRead字节。见MemoryStream(int)

您需要使用另一个构造函数来用接收到的数据填充它:

^{pr2}$

MemoryStream(Byte[])


请注意john对您接收代码的评论:

There's no guarantee you will receive the full buffer of data in a single receive event.

TcpClient.ReceiveBufferSize有一个default value 8KB。如果jpeg数据的字节数超过这个值,因为c代码只读取缓冲区一次,就不会收到整个数据。在

您可能需要在c代码中使用一个循环来读取,直到到达tcp流的末尾。在

试试这个:

var ms = new MemoryStream();
var buff = new byte[client.ReceiveBufferSize];
while (true) {
    var len = nwStream.Read(buff, 0, buff.Length);
    if (len <= 0) { break; }
    ms.Write(buff, 0, len);
}
ms.Seek(0, SeekOrigin.Begin);

希望有帮助。在

相关问题 更多 >