代码之家  ›  专栏  ›  技术社区  ›  tempaccountforissue

如何将MatPlotLib图形保存为十进制格式的PNG字节数组

  •  1
  • tempaccountforissue  · 技术社区  · 3 年前

    我有一些数据正在用MatPlotLib图形进行可视化。我希望能够将图形转换为用PNG十进制值格式化的字节数组。 https://www.w3.org/TR/PNG-Structure.html

    fig = plt.figure(figsize=(16,16))
    ax = fig.add_subplot(projection='3d')
    ax.voxels(space, facecolors = rgb_input)
    plt.axis('off')
    fig.patch.set_alpha(0.25)
    ax.patch.set_alpha(0.25)
    

    我知道如何将其保存为PNG并将其转换为字节数组,但我希望能够直接制作字节数组。

    我曾尝试使用它直接获取字节数组,但它不会返回PNG十进制值:

    buf = io.BytesIO()
    plt.savefig(buf, format = 'png')
    buf.seek(0)
    data = buf.read()
    

    编辑:经过进一步研究,我发现 data 值被格式化为ASCII字节数组。有没有办法把它转换成十进制字节数组?

    1 回复  |  直到 3 年前
        1
  •  2
  •   Saxtheowl    3 年前

    PNG图像是二进制文件,通常以ASCII或十六进制表示,要将字节数组转换为十进制表示,只需使用Python的内置函数即可。

    import io
    import matplotlib.pyplot as plt
    import numpy as np
    
    space = np.random.rand(5,5,5) > 0.5
    rgb_input = np.random.rand(5,5,5,3)
    
    fig = plt.figure(figsize=(16,16))
    ax = fig.add_subplot(projection='3d')
    ax.voxels(space, facecolors = rgb_input)
    plt.axis('off')
    fig.patch.set_alpha(0.25)
    ax.patch.set_alpha(0.25)
    
    buf = io.BytesIO()
    plt.savefig(buf, format = 'png')
    buf.seek(0)
    data = buf.read()
    
    decimal_values = [byte for byte in data]
    print(decimal_values)