Изображение PIL в виде байтов с BytesIO для предотвращения сохранения жесткого диска

Проблемно

У меня есть изображение 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()

Если мы посмотрим на документацию, мы увидим, что этот аргумент изображения функции должен быть:

ссылка на изображение: Генератор

Необходимый

Поток изображений.

Документация доступна здесь < / а>

Проблема

Когда я его выполняю, я получаю ошибку:

Файл C: ... \ envs \ trainer \ lib \ site-packages \ msrest \ service_client.py, строка 137, в блоке stream_upload = data.read (self.config.connection.data_block_size)

AttributeError: объект 'bytes' не имеет атрибута 'read'

Нет ошибки в аутентификации клиента или в другой момент, потому что, когда я даю в качестве параметра изображение, импортированное с помощью этой строки:

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

Все работает правильно ..

Источники

Я также видел этот пост, в котором подробно объясняется, что я хочу делать, но в моем случае это не работает. Любая идея будет оценена по достоинству.


person Xeyes    schedule 16.12.2020    source источник


Ответы (1)


Когда мы используем метод read_in_stream, нам нужно предоставить поток. Но код BytesIO.getvalue вернет содержимое потока в виде строки или байтов. Поэтому, пожалуйста, обновите код, как показано ниже

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

Для получения дополнительных сведений см. здесь


Обновить

Что касается проблемы, я предлагаю вам использовать 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)

введите описание изображения здесь

person Jim Xu    schedule 17.12.2020
comment
Я тоже пробовал это, но когда я это сделал, то получил следующую ошибку: ›строка 1567, в моделях read_in_stream поднять ..ComputerVisionErrorException (self._deserialize, response) azure.cognitiveservices.vision.computervision.models._models_py3.ComputerVisionErrorException: операция вернула недопустимую код состояния "Плохой запрос" - person Xeyes; 17.12.2020
comment
Но если это сделать: stream = io.BytesIO() image.save(stream, format='JPEG') f = open("file.txt", "wb") f.write(stream.getvalue()) f = open("file.txt", "rb") и я даю f как параметр, он работает отлично, но я не хочу использовать файл - person Xeyes; 17.12.2020
comment
@Xeyes, пожалуйста, проверьте мое обновление. - person Jim Xu; 18.12.2020
comment
Спасибо. он работает с этим синтаксисом - person Xeyes; 21.12.2020