Как преобразовать 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
двоичное чтение