Search on blog:

Flask: How to use BytesIO in Flask to display matplotlib image without saving in file.

Przykład pokazuje jak - użyć BytesIO do stworzenie w pamięci obiekt pseudo-pliku - zapisać w tym obiekcie obrazu z matplotlib w formacie png - pobrać dane z tego obiektu - zamienić te dane na text zakodowany base64 - stworzyć w HTML tag obrazka z osadzonym obrazkiem w base64

from flask import Flask
#from flask import render_template
import matplotlib.pyplot as plt
import io
import base64

app = Flask(__name__)

@app.route('/plot')
def build_plot():

    img = io.BytesIO()

    y = [1,2,3,4,5]
    x = [0,2,1,3,4]
    plt.plot(x,y)
    plt.savefig(img, format='png')
    img.seek(0)

    plot_url = base64.b64encode(img.getvalue()).decode()

    return '<img src="data:image/png;base64,{}">'.format(plot_url)

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

Można także zapisać obrazek matplotlib jako jpg i wtedy będzie potrzebny jpeg w src="data:image/jpeg;base64,{}".

W podobny sposób można w HTML osadzać inne pliki.

Flask: Jak wyświetlić obraz bez zapisywania go w pliku korzystając z BytesIO oraz obrazu w postaci stringu BASE64 w url

Można użyć BytesIO do stworzenia obiektu podobnego do pliku (file-like object) ale trzymanego w pamięci RAM, który może być użyty do działań na pliku obrazka bez zapisywania na dysku.

Ten przykład używa matplotlib do stworzenia PNG w pamięci

import io
import matplotlib.pyplot as plt
import random

def generate_image():

    # genereate …

« Page: 1 / 1 »