Возвращение изображения Matplotlib в виде строки - PullRequest
8 голосов
/ 10 июля 2009

Я использую matplotlib в приложении django и хотел бы напрямую вернуть обработанное изображение. Пока я могу пойти plt.savefig(...), а затем вернуть местоположение изображения.

Что я хочу сделать, это:

return HttpResponse(plt.renderfig(...), mimetype="image/png")

Есть идеи?

Ответы [ 4 ]

17 голосов
/ 10 июля 2009

Объект HttpResponse Джанго поддерживает файловый API, и вы можете передать файл-объект в savefig.

response = HttpResponse(mimetype="image/png")
# create your image as usual, e.g. pylab.plot(...)
pylab.savefig(response, format="png")
return response

Следовательно, вы можете вернуть изображение непосредственно в HttpResponse.

6 голосов
/ 10 июля 2009

как насчет cStringIO ?

import pylab
import cStringIO
pylab.plot([3,7,2,1])
output = cStringIO.StringIO()
pylab.savefig('test.png', dpi=75)
pylab.savefig(output, dpi=75)
print output.getvalue() == open('test.png', 'rb').read() # True
2 голосов
/ 11 июля 2009

В Matplotlib Cookbook есть рецепт, который делает именно это. По своей сути это выглядит так:

def simple(request):
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure

    fig=Figure()
    ax=fig.add_subplot(111)
    ax.plot(range(10), range(10), '-')
    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    canvas.print_png(response)
    return response

Поместите это в файл представлений, укажите на него свой URL, и все готово.

Редактировать: Как уже отмечалось, это упрощенная версия рецепта в кулинарной книге. Однако, похоже, что есть разница между вызовами print_png и savefig, по крайней мере в первоначальном тесте, который я сделал. Вызов fig.savefig(response, format='png') дал изображение, которое было больше и имело белый фон, в то время как исходное canvas.print_png(response) дало немного меньшее изображение с серым фоном. Итак, я бы заменил последние несколько строк выше на:

    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    fig.savefig(response, format='png')
    return response

Тем не менее, вам все еще нужно создать экземпляр canvas.

0 голосов
/ 10 июля 2009

Используйте ducktyping и передавайте свой собственный объект, скрывая файловый объект

class MyFile(object):
    def __init__(self):
        self._data = ""
    def write(self, data):
        self._data += data

myfile = MyFile()
fig.savefig(myfile)
print myfile._data

вы можете использовать myfile = StringIO.StringIO () вместо этого в реальном коде и возвращать данные в ответ, например.

output = StringIO.StringIO()
fig.savefig(output)
contents = output.getvalue()
return HttpResponse(contents , mimetype="image/png")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...