如何通过Form Recognizer使用Azure Functions Blob触发器中的图像

时间:2019-08-29 17:12:37

标签: python azure-functions microsoft-cognitive form-recognizer

我正在尝试使用Azure Functions通过Python编写的Form-Recognizer包装应用程序。我的问题是使用BlobTrigger将JPEG转换为Form-Recognizer可以使用的格式。

打开图像的基本代码是

from PIL import Image
from io import BytesIO 
import azure.functions as func

def main(blobin: func.InputStream, blobout: func.Out[bytes], context: func.Context):
image = Image.open(blobin)

图片的类为:'PIL.JpegImagePlugin.JpegImageFile'。

调用Form-Recognizer分析的代码如下:

base_url = r"<url>" + "/formrecognizer/v1.0-preview/custom"
model_id = "<model-id>"
headers = {
    'Content-Type': 'image/jpeg',
     'Ocp-Apim-Subscription-Key': '<subscription-key>',
}
resp = None
try:
    url = base_url + "/models/" + model_id + "/analyze" 
    resp = http_post(url = url, data = image, headers = headers)
    print("Response status code: %d" % resp.status_code)    
except Exception as e:
    print(str(e))

不幸的是,http_post中的data =图片必须是“ bytes”类。

因此,我尝试了使用PIL将输入图像转换为字节格式的各种方法。

我的两种主要方法是

with BytesIO() as output:
    with Image.open(input_image) as img:
    img.save(output, 'JPEG')
    image = output.getvalue()

image = Image.open(input_image)
imgByteArr = io.BytesIO()
image.save(imgByteArr, format='JPEG')
imgByteArr = imgByteArr.getvalue()

这两种方法都为我提供了字节格式,但是它仍然不起作用。无论哪种方式,我最终都会得到以下响应:

{'error': {'code': '2018', 'innerError': {'requestId': '8cff8e76-c11a-4893-8b5d-33d11f7e7646'}, 'message': 'Content parsing error.'}}

有人知道解决此问题的正确方法吗?

1 个答案:

答案 0 :(得分:0)

根据GitHub存储库blob.py中类func.InputStream的源代码Azure/azure-functions-python-library,您可以直接从{{1}的blobin变量中获取图像字节。 },通过其func.InputStream函数,如下图所示。

enter image description here

同时,请参考文档Form Recognizer APIread标头应为Content-Type

因此,我将正式示例代码更改为在Azure函数中使用,如下所示。

multipart/form-data

请不要在仅支持Python 3.6的Azure Functions中使用任何Python 2函数。