如何使用Flask将Canvas url转换为图像numpy数组?

时间:2019-01-15 12:06:12

标签: javascript python html flask html5-canvas

我正在将canvas转换为url并使用Flask通过ajax POST请求将其发送到python。我得到正确的URL,甚至打印了它,并且两者都是相同的。但是我不知道如何找回图像。我在互联网上搜索,大多数答案都说要使用解码方法,但是我得到了解码不能在'str'对象上运行的错误。我还尝试将StringIO与Image.open一起使用,这也会产生错误。那么,谁能告诉我该怎么做? 我的JS:

sortedObject

我的python代码:

$SCRIPT_ROOT = {
  {
    request.script_root | tojson | safe
  }
};
$(function() {
      $("#pic").bind('click', function() {
        ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
        var imgURL = canvas.toDataURL();

        $.ajax({
          type: "POST",
          url: $SCRIPT_ROOT + '/send_pic',
          data: {
            imageBase64: imgURL
          }
        }).done(function() {
          console.log("sent");
        });
      });

data_url的值为:

@app.route('/send_pic',methods=['GET','POST'])
def button_pressed():
    print("Image recieved")
    data_url = request.values['imageBase64']      
    img = Image.open(StringIO(data_url))
    img  = np.array(img)
    cv2.imshow(img)
    cv2.waitKeys(0)
    cv2.destroyAllWindows()

    return ""

谢谢!

1 个答案:

答案 0 :(得分:1)

从您的代码中我了解到,在您的端点中,您需要base64数据。如果是这样,您可以尝试执行以下操作:

href={`..all_rms/rmspage.html?ID=${this.state.selectedPlace.id}`}

修改: 如果您发送的数据不是base64,则可以尝试使用numpy对其进行转换,如下所示:

import base64
from io import BytesIO

@app.route('/send_pic',methods=['GET','POST'])
def button_pressed():
    print("Image recieved")
    data_url = request.values['imageBase64']
    # Decoding base64 string to bytes object
    img_bytes = base64.b64decode(data_url)
    img = Image.open(BytesIO(img_bytes))
    img  = np.array(img)
    cv2.imshow(img)
    cv2.waitKeys(0)
    cv2.destroyAllWindows()
    return ""

修改2: 根据您提供的值,必须从请求中拆分值才能获得base64图像数据:

from flask import request
...
img_data = np.fromstring(request.data, np.uint8)
# Do what you want with it
cv2.imshow(img)