Python Flask API通过tearray和metad发布和接收

2024-09-30 03:22:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个API来接收和处理图像。我必须接收bytearray格式的图像。以下是我要发布的代码:

方法1 将图像发布到api

with open("test.jpg", "rb") as imageFile:
    f = imageFile.read()
    b = bytearray(f)    
    url = 'http://127.0.0.1:5000/lastoneweek'
    headers = {'Content-Type': 'application/octet-stream'}
    res = requests.get(url, data=b, headers=headers)
    ##print received json response
    print(res.text)

我的API:在API接收图像

^{pr2}$

在我的api中,我尝试了request.get['data']request.params['data']….我得到了object has no attribute错误。在

我尝试将bytearray与图像的宽度和高度一起传递给json,如下所示:

方法2:将图像发布到api

data = '{"IMAGE":b,"WIDTH":16.5,"HEIGHT":20.5}'
url = 'http://127.0.0.1:5000/lastoneweek'
headers = {'Content-Type': 'application/json'}
res = requests.get(url, data=data, headers=headers)

把我在API的get函数改成

在api接收图像

@app.route('/lastoneweek', methods=['GET'])
def get():
    data=request.get_json()
    w = data['WIDTH']
    h = data['HEIGHT']

但收到以下错误例如:

TypeError: 'LocalProxy' does not have the buffer interface

Tags: 方法图像apijsonhttpurldataget
1条回答
网友
1楼 · 发布于 2024-09-30 03:22:59

在服务器.py文件:

from flask import Flask
from flask import request
import cv2
from PIL import Image
import io
import requests
import numpy as np

app = Flask(__name__)

@app.route('/lastoneweek', methods=['POST'])
def get():
    print(request.files['image_data'])
    img = request.files['image_data']
    image = cv2.imread(img.filename)
    rows, cols, channels = image.shape
    M = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1)
    dst = cv2.warpAffine(image, M, (cols, rows))
    cv2.imwrite('output.png', dst)
    ##do all image processing and return json response
    return 'image: success'

if __name__ == '__main__':
    try:
        app.run()
    except Exception as e:
        print(e)

与客户端.py文件格式:

^{pr2}$

我引用了这个链接:http://docs.python-requests.org/en/master/user/advanced/#post-multiple-multipart-encoded-files 这解决了第一个问题。在

image = Image.open(io.BytesIO(img))错误,因为img是不应传递给的<class 'werkzeug.datastructures.FileStorage'>拜特西奥,因为它像这里提到的对象一样使用字节:https://docs.python.org/3/library/io.html#io.BytesIO,而这里对类似对象的字节的解释:https://docs.python.org/3/glossary.html#term-bytes-like-object 所以,与其这么做。将文件名直接传递给cv2.imread(img.filename)解决了这个问题。在

相关问题 更多 >

    热门问题