如何 return 来自 fastapi 响应的 PIL 图像文件列表?

How to return a list of PIL image files from fastapi response?

我使用 fastapi 创建了一个 rest-api,它将文档 (pdf) 作为输入并 return 它的 jpeg 图像,我正在使用一个库调用 docx2pdf 进行转换。

from docx2pdf import convert_to    
from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/file/convert")
async def convert(doc: UploadFile = File(...)):
    if doc.filename.endswith(".pdf"):
        # convert pdf to image
        with tempfile.TemporaryDirectory() as path:
            doc_results = convert_from_bytes(
                doc.file.read(), output_folder=path, dpi=350, thread_count=4
            )

            print(doc_results)

        return doc_results if doc_results else None

这是doc_results的输出,基本上是PIL图像文件的列表

[<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=2975x3850 at 0x7F5AB4C9F9D0>, <PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=2975x3850 at 0x7F5AB4C9FB80>]

如果我 运行 我当前的代码,它是 return 将 doc_results 作为 json 输出,我无法将这些图像加载到另一个 API.

如何 return 图像文件而不将它们保存到本地存储?因此,我可以向此 api 发出请求并获得响应并直接处理图像。

此外,如果您知道我可以对上述代码进行任何改进以加快速度,这也会有所帮助。

感谢任何帮助。

你不能return除非你把它转换成通用的东西。

<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=2975x3850 at 0x7F5AB4C9F9D0

这基本上是说,你的记忆中有一个 PIL 对象,这里是它的位置

您能做的最好的事情就是将它们转换为字节和 return 字节数组。


您可以创建一个获取 PIL 图像并return从中获取字节值的函数。

import io

def get_bytes_value(image):
    img_byte_arr = io.BytesIO()
    img.save(img_byte_arr, format='JPEG')
    return img_byte_arr.getvalue()

然后你可以在return响应

时使用这个函数
return [get_bytes_value(image) for image in doc_results] if doc_results else None