Как создать файл-объект png-изображения из массива numpy в python без сохранения на диск (для http-запроса) - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужно отправить PNG-изображения на сервер черного ящика с запросом http.Я использую python3 для генерации изображений в массивном массиве 64x64x3.Что я сейчас делаю:

  1. Создание изображения
  2. Сохранение изображения с scipy.misc.toimage на диск
  3. Открытие сохраненного файла изображения с диска
  4. Используйте модуль запросов для отправки http-запросов с объектом изображения открытого файла изображения в нем

Это прекрасно работает, но я хочу избавиться от шагов 2 и 3, поэтому мне не нужно сохранятьМой объект на диск сначала, а затем загрузить его снова.Вместо этого я хотел бы преобразовать мой массив numpy в файл-объект, совместимый с http-сервером, и отправить его напрямую.(Как тот, который вы получаете из open ())

Я знаю, что легко конвертировать из массива в PNG-изображение, например, с помощью PIL, но я только нахожу, как это сделать в сочетании с сохранением на диск в одномфункция.

Большое спасибо за любую помощь!

Это мой код:

import numpy as np
import requests
from scipy.misc import toimage

arr = generate64x64x3ImageWithNumpy()
toimage(arr, cmin=0.0, cmax=255.0).save('tmp.png')
d = {'key':API_KEY}
f= {'image': open('tmp.png', 'rb')}
result = requests.post(SERVER_URL, files=f, data=d)

Я хочу это:

arr = generate64x64x3ImageWithNumpy()

not_on_disk = numpyArrayToPNGImageWithoutSavingOnDisk(arr)

d = {'key':API_KEY}
f = {'image': not_on_disk}
result = requests.post(SERVER_URL, files=f, data=d)

1 Ответ

0 голосов
/ 16 ноября 2018

Вы можете использовать iostream в памяти с savefig (https://docs.python.org/3/library/io.html#io.BytesIO)

import io
tmpFile = io.BytesIO()
savefig(tmpFile, format='png')

. Чтобы убедиться, что это сработало, tmpFile можно сравнить с фактическим файлом, сохраненным на диске.

# Get contents of tmpFile
tmpFile.seek(0)
not_on_disk = tmpFile.read(-1)

# Save to and load from disk
fname = 'tmp.png'
savefig(fname)
on_disk = open(fname, 'rb').read(-1)

>>>not_on_disk == on_disk
True

Редактировать Вы рассматриваете использование scipy и pil вместо matplotlib, но ответ должен работать так же, включая ключевое слово format для сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...