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!
Je crois que puisque numpy.array
s 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'
>>>
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
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
?