Python save matplotlib figure on an PIL Image object

前端 未结 2 1017
星月不相逢
星月不相逢 2021-02-02 00:15

HI, is it possible that I created a image from matplotlib and I save it on an image object I created from PIL? Sounds very hard? Who can help me?

相关标签:
2条回答
  • 2021-02-02 00:25

    To render Matplotlib images in a webpage in the Django Framework:

    • create the matplotlib plot

    • save it as a png file

    • store this image in a string buffer (using PIL)

    • pass this buffer to Django's HttpResponse (set mime type image/png)

    • which returns a response object (the rendered plot in this case).

    In other words, all of these steps should be placed in a Django view function, in 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')
    
    0 讨论(0)
  • 2021-02-02 00:25

    I was having the same question and I stumbled upon this answer. Just wanted to add to the above answer that PIL.Image.fromstring has been deprecated and frombytes should be used now instead of fromstring. Hence, we should modify line:

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

    to

    pil_image = PIL.Image.frombytes('RGB', canvas.get_width_height(), 
                     canvas.tostring_rgb())
    
    0 讨论(0)
提交回复
热议问题