Décodage en base64 de la POSTE, à utiliser dans PIL
Je suis en train de faire une API simple dans le Flacon qui accepte une image encodée en base64, puis décode pour un traitement ultérieur à l'aide d'Oreiller.
J'ai regardé quelques exemples (Un, Deux, Trois), et je pense que je obtenir de l'essence de la procédure, mais je reçois un message d'erreur lorsque Oreiller peut pas lire le string, je lui ai donné.
Voici ce que j'ai obtenu jusqu'à présent:
import cStringIO
from PIL import Image
import base64
data = request.form
image_string = cStringIO.StringIO(base64.b64decode(data['img']))
image = Image.open(image_string)
qui donne l'erreur:
IOError: cannot identify image file <cStringIO.StringIO object at 0x10f84c7a0>
- Pouvez-vous coller un exemple de ce que vous obtenez en
data['img']
? Journal, ou de l'imprimer. - Voici un exemple: jsfiddle.net/gn0x0wvc. Je l'ai mis dans un
img
étiquette pour vous assurer que les données de l'image n'était pas corrompu. - Ce qui ne l'après
b64decode()
? Est-il un autre encodage en cours, par exemple encodage? Est-il vraiment une image pris en charge par PIL? - Juste que le violon ne nous dit rien sur la façon dont vous êtes l'affichage d'une chaîne à votre ballon de serveur. Ce n'
print repr(data['img'])
produire sur votre console par exemple? - Voici une capture d'écran de la sortie de
b64 decode
: imgur.com/7ZJNuPf j'ai essayé de suivre l'exemple here. @Martijn Pieters voici ce queprint repr(data['img'])
ressemble: imgur.com/xmrvNmI
Vous devez vous connecter pour publier un commentaire.
Vous devriez essayer quelque chose comme:
Votre
data['img']
chaîne ne doit pas contenir de balises HTML ou les paramètres de ladata:image/jpeg;base64
qui sont dans l'exemple JSFiddle.J'ai changé l'image de la chaîne pour un exemple, j'ai pris à partir de Google juste pour des raisons de lisibilité.
Il y a un métadonnées préfixe de
data:image/jpeg;base64,
être inclus dans leimg
champ. Normalement, ces métadonnées sont utilisées dans un CSS ou HTML des données URI lors de l'intégration des données d'image dans le document ou feuille de style. Il est là pour fournir le type MIME et le codage des données incorporées pour le rendu du navigateur.Vous pouvez enlever le préfixe avant le décodage base64 et il devrait en résulter une image valide de données que PIL pouvez charger (voir ci-dessous), mais vous avez vraiment besoin de remettre en question la façon dont les métadonnées sont soumis à votre serveur en tant que normalement il ne devrait pas.
Désolé pour la nécromancie, mais aucune des réponses travaillé complètement pour moi. Voici le code de travail sur Python 3.6 et Flacon de 0,13.
Serveur:
Client JS: