【问题标题】:Submitting an image to Flask via curl fails with "not enough image data'通过 curl 向 Flask 提交图像失败并显示“图像数据不足”
【发布时间】:2020-04-23 01:39:16
【问题描述】:

我正在运行一个 Flask webapp,它接受 /predict 路径上的 POST 请求。应用程序在调用时会执行以下代码,将消息字节转换回 PNG 图像:

from flask import request
from PIL import Image
img = Image.frombytes('RGBA', (512,512), request.data, 'raw')

我正在通过以下curl 命令向此 API 提交一个有效的 512×512 PNG 图像:

curl -i -X POST http://127.0.0.1:5000/predict\
    -H "Content-Type: application/octet-stream"\
    --data-binary "@/Users/alex/Desktop/test_image_512.png"

请求始终失败并显示以下数据:

  [...]
  File "/Users/alex/Desktop/bob-ross-neural-painter/app/app.py", line 24, in predict
    Image.frombytes('RGBA', (512,512), request.data, 'raw')
  File "/Users/alex/miniconda3/envs/spell-dev/lib/python3.7/site-packages/PIL/Image.py", line 2542, in frombytes
    im.frombytes(data, decoder_name, args)
  File "/Users/alex/miniconda3/envs/spell-dev/lib/python3.7/site-packages/PIL/Image.py", line 829, in frombytes
    raise ValueError("not enough image data")
ValueError: not enough image data

我已验证 PNG 图像 (here) 在本地是有效的 512x512 PNG 图像:np.array(Image.open('/Users/alex/Desktop/test_image_512.png')).shape 返回 (512, 512, 4)

我似乎无法确定问题的根本原因。图像在传输过程中是否以某种方式损坏?

作为参考,这里是完整的路线定义:

@app.route('/predict', methods=['POST'])
def predict():
    # bytes -> PIL image -> array -> tensor
    img = torch.tensor(
        np.array(
            Image.frombytes('RGBA', (512,512), request.data, 'raw')
        )
    )

【问题讨论】:

标签: python curl flask png python-imaging-library


【解决方案1】:

pillow Image.fromarray 方法需要一个原始字节图作为输入,并且在给定编码像素字节时不起作用,例如此示例中的 PNG 编码像素。处理这种情况的正确方法是改用BytesIOImage.open

with open('test_image_512.png', 'rb') as f:
    img_b = f.read()
Image.open(BytesIO(img_b))

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多