Je convertis une image en base64 string et l'envoie depuis un périphérique Android au serveur. Maintenant, je dois reconvertir cette chaîne en image et la sauvegarder dans la base de données.
De l'aide?
Essaye ça:
import base64
imgdata = base64.b64decode(imgstring)
filename = 'some_image.jpg' # I assume you have a way of picking unique filenames
with open(filename, 'wb') as f:
f.write(imgdata)
# f gets closed when you exit the with statement
# Now save the value of filename to your database
Si vous souhaitez afficher cette image sans enregistrer:
from PIL import Image
import cv2
# Take in base64 string and return cv image
def stringToRGB(base64_string):
imgdata = base64.b64decode(str(base64_string))
image = Image.open(io.BytesIO(imgdata))
return cv2.cvtColor(np.array(image), cv2.COLOR_BGR2RGB)
Utilisez simplement la méthode .decode('base64')
et allez être heureux.
Vous devez également détecter le type/l’extension de l’image, comme vous pouvez l’enregistrer correctement. Dans un bref exemple, vous pouvez utiliser le code ci-dessous pour obtenir une vue Django:
def receiveImage(req):
image_ext = req.REQUEST["image_filename"] # A field from the Android device
image_data = req.REQUEST["image_data"].decode("base64") # The data image
filehandler = fopen($image_ext, "wb+")
filehandler.write(image_data)
filehandler.close()
Et, après cela, utilisez le fichier $ comme vous le souhaitez.
Simple. Très simple. ;)
Vous pouvez essayer d’utiliser open-cv pour enregistrer le fichier, car cela facilite les conversions de type d’image en interne. Le code exemple:
import cv2
import numpy as np
def save(encoded_data, filename):
nparr = np.fromstring(encoded_data.decode('base64'), np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_ANYCOLOR)
return cv2.imwrite(filename, img)
Ensuite, quelque part dans votre code, vous pouvez l'utiliser comme ceci:
save(base_64_string, 'testfile.png');
save(base_64_string, 'testfile.jpg');
save(base_64_string, 'testfile.bmp');
Cela devrait faire l'affaire:
image = open("image.png", "wb")
image.write(base64string.decode('base64'))
image.close()