[PYTHON] POSTER l'image avec json et la recevoir avec flask

Chose que tu veux faire

Je veux POSTER l'image en tant que json et la recevoir dans le flacon. Cependant, les données de type octets ne peuvent pas être utilisées comme valeur json, donc une certaine ingéniosité est requise.

J'ai installé un serveur localement et l'ai essayé.

Qu'est-ce que base64?

Comme mentionné ci-dessus, les données binaires ne peuvent pas être un élément de json. Les données textuelles sont OK.

Dans ce cas, les données binaires peuvent être converties une fois en données de texte selon une certaine règle, transmises, puis converties en données binaires d'origine à la destination de réception.

L'une des règles de conversion des données binaires en données texte est base64.

Celles-ci

Expliqué assez soigneusement.

D'abord côté client. La transition des données est la suivante.

Importer l'image en tant qu'image d'oreiller ⇒ Convertir en octets ⇒ Encode avec base64 (encore octets) ⇒ Convertir les données qui étaient des octets en str ⇒ json.dumps vers json ⇒ Vous pouvez POST en toute sécurité avec json

client.py


import requests
from PIL import Image
import json
import base64
from io import BytesIO

img = Image.open("iruka.jpeg ")

#Convertir l'image d'oreiller en octets, puis en base64
buffered = BytesIO()
img.save(buffered, format="JPEG")
img_byte = buffered.getvalue() # bytes
img_base64 = base64.b64encode(img_byte) #octets encodés en base64 * pas str

#C'est toujours des octets si json.Convertir en str en vidages(Parce que l'élément json ne prend pas en charge le type d'octets)
img_str = img_base64.decode('utf-8') # str

files = {
    "text":"hogehoge",
    "img":img_str
    }

r = requests.post("http://127.0.0.1:5000", json=json.dumps(files)) #POST sur le serveur en tant que json

print(r.json())


>>>{'img_shape': [750, 500], 'text': 'hogehogefuga'}

Puis côté serveur. La transition des données est la suivante.

Recevoir avec json ⇒ Extraire les données souhaitées (données texte encodées en base64) de json ⇒ Décodez les données texte encodées en base64 et convertissez-les en octets ⇒ Convertir en _io.BytesIO pour qu'il puisse être manipulé par Pillow ⇒ Vous pouvez obtenir l'image d'oreiller originale en toute sécurité

server.py


from flask import Flask, jsonify, request
from PIL import Image
import json
import base64
from io import BytesIO
import matplotlib.pyplot as plt

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index():
    json_data = request.get_json() #Obtenez le json POSTÉ
    dict_data = json.loads(json_data) #Convertir json en dictionnaire

    img = dict_data["img"] #Sortez base64# str
    img = base64.b64decode(img) #Convertir les données d'image converties en base64 en données binaires d'origine# bytes
    img = BytesIO(img) # _io.Converti pour être géré par l'oreiller BytesIO
    img = Image.open(img) 
    img_shape = img.size #Traitez correctement l'image acquise
    
    text = dict_data["text"] + "fuga" #Traiter correctement avec le texte acquis

    #Renvoyer le résultat du traitement au client
    response = {
        "text":text,
        "img_shape":img_shape        
        }

    return jsonify(response)

if __name__ == "__main__":
    app.debug = True
    app.run()

Il a été confirmé par la réponse du serveur que l'image était correctement traitée.

Au fait base64.b64encode () a des octets en entrée et des octets en sortie. L'entrée de base64.b64decode () peut être bytes ou str, mais la sortie est bytes.

référence

python --command --decode base64 depuis POST et utilisez-le dans PIL

How to convert PIL Image.image object to base64 string? [duplicate]

Recommended Posts

POSTER l'image avec json et la recevoir avec flask
POSTER diversement avec Python et recevoir avec Flask
POST JSON avec Python et recevez avec PHP
Envoyer et recevoir des données d'image au format JSON en Python sur le réseau
POSTEZ l'image sélectionnée sur le site Web avec multipart / form-data et enregistrez-la sur Amazon S3! !!
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
Gratter l'holojour et l'afficher dans la CLI
Générer et publier des données d'image factice avec Django
Répondre à l'image redimensionnée à l'aide de Flask et PILImage
Je suis accro à la différence dans la façon dont Flask et Django reçoivent les données JSON
Analyser et visualiser JSON (application Web ⑤ avec Python + Flask)
Lire le fichier json avec Python, le formater et générer le json
Créez un modèle de classification d'images de manière explosive avec Azure Custom Vision et implémentez-le avec Flask
CNN avec keras Essayez avec l'image que vous avez prise
Segmentation d'image avec scikit-image et scikit-learn
Exécutez l'application avec Flask + Heroku
Accordez un jeton d'accès avec la commande curl et POST l'API
Encodage et décodage JSON avec python
Authentification de base, authentification Digest avec Flask
Prenez une image avec Pepper et affichez-la sur votre tablette
[Python3] Enregistrez la matrice de moyenne et de covariance dans json avec les pandas
Connectez-vous avec PycURL et recevez une réponse
Essayez de brouiller l'image avec opencv2
Jugez l'extension et téléchargez l'image
Création d'un babillard avec flask
Fonction de téléchargement d'image avec Vue.js + Flask
J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.
Mettez vos propres données d'image dans Deep Learning et jouez avec
Récupérer le csv publié avec Github Action et le publier sur les pages Github
Extraire le résultat de la commande TOP avec USER et le sortir au format CSV
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
J'ai vectorisé l'accord de la chanson avec word2vec et je l'ai visualisé avec t-SNE
Convertissez la feuille de calcul en CSV et importez-la dans Cloud Storage avec Cloud Functions
Imaginez le fichier pdf et tamponnez toutes les pages avec des tampons (images) confidentiels.
Démarrez la webcam, prenez une image fixe et enregistrez-la localement
[python] Envoyez l'image capturée de la caméra Web au serveur et enregistrez-la
Inférence d'image de visage à l'aide de Flask et TensorFlow
Faites un clic droit sur l'image → Réalisez "Compresser avec TinyPNG"
J'ai essayé de jouer avec l'image avec Pillow
Trouvez-le dans la file d'attente et modifiez-le
Ajouter des lignes et du texte sur l'image
(Pour moi) Flask_3 (formulaire, POST et GET)
Dispersion avec la bibliothèque standard et l'oreiller de Python Trouvez l'écart type RVB de l'image et déterminez s'il est monochromatique
GAE --Avec Python, faites pivoter l'image en fonction des informations de rotation d'EXIF et importez-la dans Cloud Storage.
Fabriquez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 3
Jouons avec Python Receive et enregistrez / affichez le texte du formulaire de saisie
Extraire la couleur de l'objet dans l'image avec le clustering Mask R-CNN et K-Means
D'une manière ou d'une autre, le code que j'ai écrit a fonctionné et j'ai été impressionné, alors je vais le poster
Utilisez Pillow pour rendre l'image transparente et en superposer une partie seulement
Lisez l'image postée par flask afin qu'elle puisse être manipulée par opencv
C'est très rapide lorsque vous recevez le bulletin de tremblement de terre d'urgence sur le moniteur de mouvement fort et que vous le gérez avec JSON
J'ai essayé de "lisser" l'image avec Python + OpenCV
Coupez l'image aux coins arrondis avec pythonista
Texte de l'image et publication sur slack (python slackbot)
J'ai essayé de "différencier" l'image avec Python + OpenCV
Lire JSON avec Python et générer un CSV
Créez une application de composition d'images avec Flask + Pillow
Déterminez les nombres dans l'image prise avec la webcam
Détecter les dossiers avec la même image dans ImageHash