【发布时间】:2020-10-23 16:36:20
【问题描述】:
我在 C# 中将图像保存为字节数组。下面是一个如何创建这样一个数组的示例:
byte[] image_bytes= new byte[100] {137, 80, 78, 71, ..., 130};
注意:以上是我实现字节数组的一个简化例子。实际上,我使用Unity 来生成数组。以下是关于我如何实际生成字节数组的简短 sn-p,以防这有助于阐明问题的后半部分:
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# 图像的字节数组。我可以使用WriteAllBytes 在 C# 中保存字节数组。我将字节数组发送到 Python 脚本并确认它未损坏。如何保存文件,甚至更好地将文件转换为 Python 中的 OpenCV 框架?
【问题讨论】:
-
Does this answer your question? “C# 脚本然后通过 TCP 连接将字节数组作为 JSON 字符串发送到 python 脚本” - 这听起来非常低效。如果可能,最好只发送原始二进制数据。
-
将来,我可能会这样做。现在,我使用 JSON,因为还有许多其他变量正在发送;图片只是其中之一。关于这个问题,我提出 JSON 的原因是,据我所知,python 脚本会从 C# 脚本接收未损坏的数据。我似乎无法以任何有意义的方式使用它。
-
你的
numpy.ndarray对我来说没有意义,dtype=bytes将使每个项目成为一个字节字符串。我假设您的data是整数列表?您可能需要dtype=np.uint8,但要获取原始字节,只需使用bytes(data),它应该会重现您想要的实际字节。 -
很可能,你想要
cv2.imdecode(bytes(data), cv2.IMREAD_COLOR) -
另外,我同意@John 你应该只是发送原始数据
标签: python c# numpy opencv unity3d