Matplotlib 이미지를 문자열로 반환
-
12-09-2019 - |
문제
django 앱에서 matplotlib를 사용하고 있으며 렌더링된 이미지를 직접 반환하고 싶습니다.지금까지는 갈 수 있어 plt.savefig(...)
, 이미지의 위치를 반환합니다.
내가 하고 싶은 일은:
return HttpResponse(plt.renderfig(...), mimetype="image/png")
어떤 아이디어가 있나요?
해결책
장고의 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
.
다른 팁
~는 어때 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
에 레시피가 있어요 Matplotlib 요리책 그게 바로 이 일을 하는 거죠.핵심은 다음과 같습니다.
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
하지만 여전히 캔버스를 인스턴스화해야 합니다.
덕타이핑을 사용하고 파일 객체로 위장하여 자신만의 객체를 전달합니다.
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")