如何将Matplotlib图形保存为十进制格式的PNG字节数组
Matplotlib生成PNG十进制字节数组解决方案
问题描述
我用Matplotlib可视化数据生成3D体素图形,代码如下:
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再转换。尝试以下代码后,得到的是bytes类型数据,看起来像ASCII字节数组,不知道怎么转成十进制数组:
buf = io.BytesIO() plt.savefig(buf, format = 'png') buf.seek(0) data = buf.read()
解决方法
你得到的data本身就是PNG的二进制字节数据,每个字节对应0-255的十进制数值,只是Python打印bytes对象时,会把可打印的ASCII字符显示为字符形式,而非数值。要转换成十进制整数数组,直接用以下两种方式:
方式1:Python内置list转换
import io import matplotlib.pyplot as plt # 你的绘图代码... buf = io.BytesIO() plt.savefig(buf, format='png') buf.seek(0) data = buf.read() # 转换为十进制整数数组 decimal_byte_array = list(data) # 此时decimal_byte_array里的每个元素都是0-255的十进制整数
方式2:Numpy生成高效数值数组(适合大数据量)
如果需要处理大规模数据,用Numpy转换更高效:
import numpy as np # 接上面的data decimal_byte_array = np.array(data, dtype=np.uint8) # 得到uint8类型的Numpy数组,每个元素对应十进制字节值
解释:bytes对象本质是不可变的字节序列,每个元素的取值范围就是0-255的整数,list(data)会把每个字节直接转成对应的十进制整数;Numpy方式则生成更紧凑的数值数组,适合后续数值操作。
内容的提问来源于stack exchange,提问作者tempaccountforissue
相关产品推荐
相关产品推荐

