PIL Image as Bytes with BytesIO 防止硬盘保存

PIL Image as Bytes with BytesIO to prevent hard disk saving

有问题

我有一个 PIL 图像,我想将它转换为字节数组。我无法将图像保存在我的硬盘上,所以我无法使用默认的 open(file_path, 'rb') 功能。

我试过的

为了解决这个问题,我正在尝试使用 io 库来执行此操作:

buf = io.BytesIO()
image.save(buf, format='JPEG')
b_image = buf.getvalue()

将图像视为功能性 PIL 图像。

“b_image”将用作 Microsoft Azure 认知服务功能的参数read_in_stream()

如果我们查看文档,我们可以看到这个函数图像参数必须是:

image xref:Generator

Required

An image stream.

文档可用here

问题

当我执行它时出现错误:

File "C:...\envs\trainer\lib\site-packages\msrest\service_client.py", line 137, in stream_upload chunk = data.read(self.config.connection.data_block_size)

AttributeError: 'bytes' object has no attribute 'read'

客户端身份验证或其他地方没有错误,因为当我将使用此行导入的图像作为参数时:

image = open("./1.jpg", 'rb')

一切正常..

来源

我还看到 post 准确地解释了我想做什么,但在我的情况下它不起作用。任何想法将不胜感激。

当我们使用方法read_in_stream时,我们需要提供一个流。但是代码 BytesIO.getvalue 将 return 流的内容作为字符串或字节。所以请更新代码如下

buf = io.BytesIO()
image.save(buf, format='JPEG')
computervision_client.read_in_stream(buf)

详情请参考here


更新

关于这个问题,我建议你使用rest API来实现你的需求。

import io
import requests
from PIL import Image
import time
url = "{your endpoint}/vision/v3.1/read/analyze"
key = ''
headers = {
    'Ocp-Apim-Subscription-Key': key,
    'Content-Type': 'application/octet-stream'
}

// process image
...
with io.BytesIO() as buf:
    im.save(buf, 'jpeg')
    response = requests.request(
        "POST", url, headers=headers, data=buf.getvalue())
    
    # get result

    while True:
        res = requests.request(
            "GET", response.headers['Operation-Location'], headers=headers)
        status = res.json()['status']
        if status == 'succeeded':
            print(res.json()['analyzeResult'])
            break
        time.sleep(1)