Python中C#的WriteAllBytes等效函数

看门狗101

我有一个图像另存为C#中的字节数组。下面是如何创建这样的数组的示例:

byte[] image_bytes= new byte[100] {137, 80, 78, 71, ..., 130};

注意:以上是我实现字节数组的简化示例。实际上,我正在使用Unity生成数组。以下是有关如何实际生成字节数组的简短摘要,以防出现问题的后半部分:

camera.Render();
...
Texture2D image = new Texture2D(camera.targetTexture.width, camera.targetTexture.height);
image.ReadPixels(new Rect(0, 0, camera.targetTexture.width, camera.targetTexture.height), 0, 0);
image.Apply();
byte[] image_bytes = image.EncodeToPNG();
...

在C#中,我可以使用该功能WriteAllBytes将该图像另存为文件,以后再在计算机上打开。我已经对此进行了测试,因此知道上面的image_bytes数组没有损坏,因为我可以查看最终图像image_name.png

File.WriteAllBytes("image_name.png", image_bytes);

然后,C#脚本通过TCP连接将字节数组作为JSON字符串发送到python脚本。我已经确认字节数组到达python脚本中并且具有相同的长度。我还确认前四个字节相同,例如:

>>> data = json.loads(message)
>>> img_bytes = np.array(data["image"], dtype=bytes)
>>> print(img_bytes[0])
b'137'
>>> print(img_bytes[1])
b'80'
...
>>> print(img_bytes[-1])
b'130'

我的目标是最终将字节数组转换为OpenCV帧,以便可以在其上使用OpenCV函数但是,我什至似乎都无法使用它的基础知识,例如将其保存到文件中。当我尝试将数据保存到python脚本中的文件时,标准的图像查看软件无法打开结果文件。我已经尝试了基本的文件保存操作:

>>> with open("image_name.png", 'wb') as w:
>>>   w.write(img_bytes)

我已经尝试过使用OpenCV:

>>> img_np = cv2.imdecode(img_bytes, cv2.IMREAD_COLOR)
>>> cv2.imwrite("image_name.png", img_np)

我也尝试过使用PIL(注意:这里我使用图片的尺寸):

>>> img_np = Image.frombytes('RGBA', (512, 384), img_bytes, 'raw')
>>> img_np.save("image_name.png")

上面的Python保存功能都不起作用(它们都创建文件,但是无法打开和查看文件)。我究竟做错了什么?如何保存文件,或者更好地将数据转换为Python中的OpenCV框架?

TLDR:我有一个字节数组,代表C#中的图像。我可以使用将字节数组保存在C#中WriteAllBytes我将字节数组发送到Python脚本,并确认字节数组未损坏。如何保存文件,或者更好地将文件转换为Python中的OpenCV框架?

胡安帕·阿里维利亚加

使用dtype=bytes没有意义。这使得每个项目都是一个字节字符串,因此img_bytes[0]不是。字节137,它是字节字符串 b'137,因为它data["image"]是一个整数列表。

您很可能想要:

img_bytes = np.array(data["image"], dtype=np.uint8)

但是,您也可以使用:

img_bytes = bytes(data["image"])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章