web-dev-qa-db-fra.com

Comment convertir un tableau numpy Python en sortie base64

J'ai essentiellement besoin de faire this mais en Python au lieu de Javascript. Je reçois une chaîne encodée en base64 à partir d'une connexion socketio, la convertis en uint8 et la travaille, puis ai besoin de la convertir en chaîne base64 afin que je puisse la renvoyer.

Donc, à ce stade, j'ai ceci (je reçois le dictionnaire data du serveur 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)

Comment inverser ce processus pour passer de img à base64_image_string?

UPDATE:
J'ai résolu ce problème de la manière suivante (en continuant avec l'extrait de code ci-dessus):

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

De manière quelque peu déroutante, new_image_string n'est pas identique à base64_image_string mais l'image rendue à partir de new_image_string est identique, je suis donc satisfait!

6
Ryan Keenan

Je crois que puisque numpy.arrays prend en charge le protocole de mémoire tampon, vous avez juste besoin des éléments suivants:

processed_string = base64.b64encode(img)

Donc, par exemple:

>>> 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'
>>>
2

from 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

est une lecture binaire

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

0
ralf htp

J'ai le même problème. Après quelques recherches et essais, ma solution finale est presque la même que la vôtre.

La seule différence est que la chaîne encodée en base64 correspond aux données au format png. Je dois donc la changer de RGBA à RGB canaux avant de la convertir en np.array:

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

Dans le processus inverse, vous traitez les données au format JPEG. C'est peut-être pour cette raison que new_image_string n'est pas identique à base64_image_string?

0
Ce Ge