【问题标题】:Matplotlib graphic image to base64Matplotlib 图形图像转 base64
【发布时间】:2016-10-29 21:34:30
【问题描述】:

问题:需要将matplotlib的图形图像转换为base64图像

当前解决方案:将matplot图像保存在缓存文件夹中,用read()方法读取,然后转换为base64

新问题:烦恼:需要一种解决方法,所以我不需要将图形保存为任何文件夹中的图像。我只想使用内存中的图像。进行不必要的 I/O 是一种不好的做法。

def save_single_graphic_data(data, y_label="Loss", x_label="Epochs", save_as="data.png"):
    total_epochs = len(data)
    plt.figure()
    plt.clf()

    plt.plot(total_epochs, data)

    ax = plt.gca()
    ax.ticklabel_format(useOffset=False)

    plt.ylabel(y_label)
    plt.xlabel(x_label)

    if save_as is not None:
        plt.savefig(save_as)

    plt.savefig("cache/cached1.png")

    cached_img = open("cache/cached1.png")

    cached_img_b64 = base64.b64encode(cached_img.read())

    os.remove("cache/cached1.png")

    return cached_img_b64

【问题讨论】:

    标签: python python-2.7 matplotlib


    【解决方案1】:
    import cStringIO
    my_stringIObytes = cStringIO.StringIO()
    plt.savefig(my_stringIObytes, format='jpg')
    my_stringIObytes.seek(0)
    my_base64_jpgData = base64.b64encode(my_stringIObytes.read())
    

    [edit]在python3中应该是

    import io
    my_stringIObytes = io.BytesIO()
    plt.savefig(my_stringIObytes, format='jpg')
    my_stringIObytes.seek(0)
    my_base64_jpgData = base64.b64encode(my_stringIObytes.read())
    

    我认为至少...基于文档http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig

    【讨论】:

    • 如果您使用的是 Python 3 或更高版本,则需要使用 @nobar 在stackoverflow.com/a/18284900/1802726 中提到的io.BytesIO
    • 或者为了 Python 2/3 与最快实现的兼容性:try: from cStringIO import StringIO; except ImportError: from six import StringIO (six ref)
    【解决方案2】:

    我无法得到以上工作的答案,但这样做了:

        import io
        import base64
        s = io.BytesIO()
        plt.plot(list(range(100)))
        plt.savefig(s, format='png', bbox_inches="tight")
        plt.close()
        s = base64.b64encode(s.getvalue()).decode("utf-8").replace("\n", "")
        return '<img align="left" src="data:image/png;base64,%s">' % s
    

    【讨论】:

    • 这是最快的解决方案吗?
    【解决方案3】:

    对于python 3

    import base64
    import io 
    pic_IObytes = io.BytesIO()
    plt.savefig(pic_IObytes,  format='png')
    pic_IObytes.seek(0)
    pic_hash = base64.b64encode(pic_IObytes.read())
    

    原因是cStringIOcStringIO.StringIO() 都已弃用

    【讨论】:

    • 您可能需要添加更详细的说明
    • @YuliaV 我的意思是,在 Python 3 中,cStringIO 模块已被弃用以代替 io 模块。所以这就是我在回答中使用 io 模块的原因。
    猜你喜欢
    • 2018-01-13
    • 2021-05-25
    • 1970-01-01
    • 2016-03-24
    • 2015-12-09
    • 2015-12-18
    • 2017-04-24
    • 2022-12-25
    • 2019-11-06
    相关资源
    最近更新 更多