从JavaScript发送base64图像到Python

时间:2018-03-22 22:10:43

标签: javascript json python-2.7 base64 tornado

我正致力于在Python上处理基于JavaScript的赛车游戏框架。我在Python上使用Tornado Web Server。该游戏的分辨率为480x360。我在每个帧中从画布获取图像,然后在发送Web服务器之前重新缩放它。

但是在Python中,我无法解码图像。在这里,我的代码是

在JavaScript中:

function encode() {
  var imageData = ctx.getImageData(0, 0, 360, 480);
  var downsized = "";
  for (var i = 0; i < imageData.data.length; i++) {
    var d = imageData.data[i];
    downsized += String.fromCharCode(d);
  }
  return downsized;
}

function processFrame(foobaz) {
  downsizeImage.src = canvas.toDataURL()
  downsizeCtx.drawImage(downsizeImage, 0, 0, 84, 84)
  var imageData = downsizeCtx.getImageData(0, 0, 84, 84);
  var counter = 0;
  var downsized = ""
for (var i = 0; i < imageData.data.length; i++) {
    var d = imageData.data[i];
    if (i % 4 == 3){
      continue;
    }
    else{
      downsized += String.fromCharCode(Math.round(d));
    }
  }
return btoa(downsized);
}

然后,我将重新调整的图像发送到Python

$.ajax({
      type: 'POST',
      url: '/frame?telemetry=' + JSON.stringify({
        all_data: [all_data],
        terminal: true,
        was_start: WAS_START,
        action: [keyLeft, keyRight, keyFaster, keySlower]
      }),
      data: processFrame(),
      contentType: "application/json"
  }).done(function(data) {
    location.reload();
  });

在Python中:

class FrameHandler(tornado.web.RequestHandler):
    def post(self):
        global speed_data, start, position_data
        fulldata = self.request.body
        ar = np.fromstring(base64.decodestring(self.request.body), dtype=np.uint8)
        img = ar.reshape(84, 84, 3)

在调试模式下,fulldata变量的值类似于&#34; AAAAAAAAAAAAAAAAAA ...&#34;和解码数组&#34; ar&#34;只有0个值。

我在哪里错过了?

1 个答案:

答案 0 :(得分:0)

我在代码中做了一些更改。在这里,我不再缩小图像尺寸了。这解决了这个问题。这是解决方案。

  var imageData = ctx.getImageData(85, 10, 300, 300);
  var downsized = "";
     for (var i = 0; i < imageData.data.length; i++) {
        var d = imageData.data[i];
        if (i % 4 == 3){
          continue;
        }
        else{
          downsized += String.fromCharCode(Math.round(d));
    }
  }


  return btoa(downsized);
}