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é.
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.
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.
python --command --decode base64 depuis POST et utilisez-le dans PIL
How to convert PIL Image.image object to base64 string? [duplicate]
Recommended Posts