Ich möchte das Bild als json veröffentlichen und es in einer Flasche erhalten. Daten vom Bytetyp können jedoch nicht als JSON-Wert verwendet werden, sodass ein gewisser Einfallsreichtum erforderlich ist.
Ich habe einen Server lokal eingerichtet und ausprobiert.
Wie oben erwähnt, können Binärdaten kein Element von json sein. Textdaten sind OK.
In diesem Fall können die Binärdaten einmal nach einer bestimmten Regel in Textdaten umgewandelt, übertragen und dann am Empfangsziel in die ursprünglichen Binärdaten umgewandelt werden.
Eine der Regeln zum Konvertieren von Binärdaten in Textdaten ist base64.
Ziemlich sorgfältig erklärt.
Zuerst auf der Client-Seite. Der Datenübergang ist wie folgt.
Importieren Sie das Bild als Kissenbild ⇒ In Bytes konvertieren ⇒ Mit base64 codieren (noch Bytes) ⇒ Konvertieren Sie Daten, die Bytes waren, in str ⇒ json .dumps zu json ⇒ Sie können sicher mit json POSTEN
client.py
import requests
from PIL import Image
import json
import base64
from io import BytesIO
img = Image.open("iruka.jpeg ")
#Konvertieren Sie das Kissenbild in Bytes und dann in base64
buffered = BytesIO()
img.save(buffered, format="JPEG")
img_byte = buffered.getvalue() # bytes
img_base64 = base64.b64encode(img_byte) #base64-codierte Bytes * nicht str
#Es ist immer noch Bytes so json.In str in Dumps konvertieren(Weil das json-Element den Bytetyp nicht unterstützt)
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 als json an den Server
print(r.json())
>>>{'img_shape': [750, 500], 'text': 'hogehogefuga'}
Dann serverseitig. Der Datenübergang ist wie folgt.
Mit json empfangen ⇒ Extrahieren Sie die gewünschten Daten (in base64 codierte Textdaten) aus json ⇒ Decodieren Sie base64-codierte Textdaten und konvertieren Sie sie in Bytes ⇒ In _io.BytesIO konvertieren, damit es von Pillow verarbeitet werden kann ⇒ Sie können das ursprüngliche Kissenbild sicher erhalten
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() #Holen Sie sich den POSTed Json
dict_data = json.loads(json_data) #Konvertieren Sie json in ein Wörterbuch
img = dict_data["img"] #Nehmen Sie base64 heraus# str
img = base64.b64decode(img) #Konvertieren Sie in base64 konvertierte Bilddaten in ursprüngliche Binärdaten# bytes
img = BytesIO(img) # _io.Umgerüstet, um von BytesIO Kissen gehandhabt zu werden
img = Image.open(img)
img_shape = img.size #Verarbeiten Sie das aufgenommene Bild entsprechend
text = dict_data["text"] + "fuga" #Mit dem erfassten Text richtig verarbeiten
#Geben Sie das Verarbeitungsergebnis an den Client zurück
response = {
"text":text,
"img_shape":img_shape
}
return jsonify(response)
if __name__ == "__main__":
app.debug = True
app.run()
Aus der Antwort des Servers wurde bestätigt, dass das Bild korrekt verarbeitet wurde.
Apropos base64.b64encode () hat Bytes als Eingabe und Bytes als Ausgabe. Die Eingabe von base64.b64decode () kann Bytes oder str sein, die Ausgabe sind jedoch Bytes.
python --command --decode base64 von POST und verwende es in PIL
How to convert PIL Image.image object to base64 string? [duplicate]
Recommended Posts