2010-10-15 13 views

Odpowiedz

14

Renderowanie obrazów matplotlib na stronie internetowej w Framework Django:

  • tworzyć fabułę matplotlib

  • zapisać go jako plik png

  • sklep ten obraz w buforze smyczkową (używając PIL)

  • Przekaż ten bufor do Django za HttpResponse (zestaw typu MIME/obraz PNG)

  • która zwraca się obiekt reakcji (renderowany wykresu w tym przypadku).

Innymi słowy, wszystkie te kroki powinny być umieszczone w Django widok funkcji w views.py:

from matplotlib import pyplot as PLT 
import numpy as NP 
import StringIO 
import PIL 
from django.http import HttpResponse 


def display_image(request) : 
    # next 5 lines just create a matplotlib plot 
    t = NP.arange(-1., 1., 100) 
    s = NP.sin(NP.pi*x) 
    fig = PLT.figure() 
    ax1 = fig.add_subplot(111) 
    ax1.plot(t, s, 'b.') 

    buffer = StringIO.StringIO() 
    canvas = PLT.get_current_fig_manager().canvas 
    canvas.draw() 
    pil_image = PIL.Image.fromstring('RGB', canvas.get_width_height(), 
       canvas.tostring_rgb()) 
    pil_image.save(buffer, 'PNG') 
    PLT.close() 
    # Django's HttpResponse reads the buffer and extracts the image 
    return HttpResponse(buffer.getvalue(), mimetype='image/png') 
2

Miałem to samo pytanie i natknąłem się na tę odpowiedź. Po prostu chciałem dodać do powyższej odpowiedzi, że PIL.Image.fromstring został wycofany, a odbytes powinien być teraz użyty zamiast zstring. Stąd powinniśmy zmodyfikować wiersz:

pil_image = PIL.Image.fromstring('RGB', canvas.get_width_height(), 
       canvas.tostring_rgb()) 

do

pil_image = PIL.Image.frombytes('RGB', canvas.get_width_height(), 
       canvas.tostring_rgb()) 
Powiązane problemy