Как преобразовать Python NumPy массив в вывод Base64

Мне в основном нужно сделать это, но в Python вместо Javascript. Я получаю строку в кодировке base64 из соединения socketio, преобразую ее в uint8 и работаю над ней, затем мне нужно преобразовать ее в строку base64, чтобы я мог отправить ее обратно.

Итак, до этого момента у меня есть это (я получаю data словарь с сервера socketio):

import pickle
import base64
from io import BytesIO
from PIL import Image

base64_image_string = data["image"]
image = Image.open(BytesIO(base64.b64decode(base64_image_string)))
img = np.array(image)

Как мне отменить этот процесс, чтобы получить от img вернуться к base64_image_string?

ОБНОВИТЬ:
Я решил это следующим образом (продолжая фрагмент кода выше):

pil_img = Image.fromarray(img)
buff = BytesIO()
pil_img.save(buff, format="JPEG")
new_image_string = base64.b64encode(buff.getvalue()).decode("utf-8")

Несколько запутанно, new_image_string не идентичен base64_image_string но изображение от new_image_string выглядит так же, я доволен!

3 ответа

Я верю с numpy.arrayДля поддержки протокола буфера вам просто нужно следующее:

processed_string = base64.b64encode(img)

Так, например:

>>> encoded = b"aGVsbG8sIHdvcmxk"
>>> img = np.frombuffer(base64.b64decode(encoded), np.uint8)
>>> img
array([104, 101, 108, 108, 111,  44,  32, 119, 111, 114, 108, 100], dtype=uint8)
>>> img.tobytes()
b'hello, world'
>>> base64.b64encode(img)
b'aGVsbG8sIHdvcmxk'
>>>

У меня та же проблема. После некоторых поисков и попыток мое окончательное решение почти совпадает с вашим.

Единственное отличие состоит в том, что закодированная в base64 строка png форматировать данные, поэтому мне нужно изменить его с RGBA в RGB каналы перед преобразованием в np.array:

image = image.convert ("RGB")
img = np.array(image)

В обратном процессе вы рассматриваете данные как JPEG формат, может быть, поэтому new_image_string не идентичен base64_image_string?

С http://www.programcreek.com/2013/09/convert-image-to-string-in-python/:

import base64

with open("t.png", "rb") as imageFile:
    str = base64.b64encode(imageFile.read())
    print str

двоичное чтение

https://docs.python.org/2/library/base64.html

Другие вопросы по тегам