【发布时间】:2021-04-28 22:32:53
【问题描述】:
我正在使用以下代码从 python 端编码图像,
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5558")
frame = cv2.imread("input.jpg")
encoded, buffer = cv2.imencode('.jpg', frame)
encoded_string = base64.b64encode(buffer)
socket.send_string("output", zmq.SNDMORE)
socket.send_pyobj(encoded_string)
最终,我在 Unity 端使用以下代码对其进行解密。
void Start()
{
AsyncIO.ForceDotNet.Force();
NetMQConfig.ManualTerminationTakeOver();
NetMQConfig.ContextCreate(false);
string topic = "output";
subSocket = new SubscriberSocket();
var timeout = new System.TimeSpan(0, 0, 1); //1sec
string subport;
subSocket.Options.ReceiveHighWatermark = 1000;
subSocket.Connect("tcp://localhost:5558");
subSocket.Subscribe(topic);
bool is_connected = subSocket.TryReceiveFrameString(timeout, out subport);
Debug.Log(is_connected);
myTexture = new Texture2D(640, 480, TextureFormat.ARGB32, false);
}
// Update is called once per frame
void Update()
{
string base64string = subSocket.ReceiveFrameString();
Debug.Log(base64string.Length);
if (base64string.Length > 100)
{
byte[] imgBytes = Convert. FromBase64String(base64string);
myTexture.LoadRawTextureData(imgBytes);
myTexture.Apply();
rawImg.texture = myTexture;
}
}
不幸的是,它引发了以下错误,
FormatException:输入不是有效的 Base-64 字符串,因为它 包含非 base 64 字符、两个以上的填充字符,或 填充字符中的非法字符。
我错过了什么?
【问题讨论】:
-
请记住
b64encode不会更改缓冲区。它返回一个新字符串,如:b64result = base64.b64encode(buffer). -
@TimRoberts 你能解释一下吗?
-
你打电话给
base64.b64encode(buffer)。如果这真的是你所拥有的,那么编码器将愉快地对缓冲区中的所有字节进行 base64 编码,然后将编码结果返回给你,你会立即将其扔在地板上。buffer中的数据不会改变。正如我在上面所做的那样,您需要在一个新的(或相同的)变量中捕获返回值。这就像打电话给math.sqrt(64)。这会计算一个结果,但除非您保存返回值,否则结果将消失。 -
即使在与
encoded_string = base64.b64encode(buffer))隔离之后仍然抛出相同的错误 -
好的,但是您是否更改了将“encoded_string”发送到客户端,或者您仍在发送“buffer”?