Python 打印到图像对象
我可以使用Python 打印到图像对象,python,numpy,matplotlib,plot,imshow,Python,Numpy,Matplotlib,Plot,Imshow,我可以使用imshow()保存单个绘图,因为它返回图像对象,如下所示: image = plt.imshow(list, interpolation=None) # Save PNG to memory buffer as BytesIO from io import BytesIO buffer = BytesIO() plt.savefig(buffer,format='png') PNG = buffer.getvalue() 稍后,我想创建许多这些图像的动画,保存在列表中,并将其渲
imshow()
保存单个绘图,因为它返回图像对象,如下所示:
image = plt.imshow(list, interpolation=None)
# Save PNG to memory buffer as BytesIO
from io import BytesIO
buffer = BytesIO()
plt.savefig(buffer,format='png')
PNG = buffer.getvalue()
稍后,我想创建许多这些图像的动画,保存在列表中,并将其渲染为视频。(如果这种方法很愚蠢,请让我知道,我担心我做错了什么。) 但是我不知道我怎么能用两个子地块的图形做同样的事情。难道不应该有一个函数返回图像对象吗
list = [[1,2,3,4,5,6,7,8],
[1,2,3,4,5,6,7,8]]
list2 = [[1,2,3,4,5,6,7,8],
[1,2,3,4,5,6,7,8]]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
ax.imshow(list, interpolation=None)
ax2 = fig.add_subplot(2, 1, 2)
ax2.imshow(list, interpolation=None)
plt.show()
我不想显示绘图,而是想将其保存为图像对象。
我的目标是创建一个动画(许多情节)并将其渲染为视频。也许我的方法是错误的。有更好的解决办法吗
plt.savefig('someimgname.jpg')
这样就行了。但请记住,完成此操作后,使用Image.open()
打开此操作即可
im = Image.open('someimgname.jpg')
im.show() # or do whatever you want to do with this image object
示例代码:
from matplotlib import pyplot as plt
from PIL import Image
list = [[1,2,3,4,5,6,7,8],
[1,2,3,4,5,6,7,8]]
list2 = [[1,2,3,4,5,6,7,8],
[1,2,3,4,5,6,7,8]]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
ax.imshow(list, interpolation=None)
ax2 = fig.add_subplot(2, 1, 2)
ax2.imshow(list, interpolation=None)
plt.savefig('someimgname.jpg')
im = Image.open("someimgname.jpg") # desired image object
im.show()
plt.show()
参考资料:
回答的第二部分,我检查了文档中的matplotlib.pyplot.savefig(*args,**kwargs)
它说
第一个参数fname
是一个路径,或者类似于Python文件的对象,或者可能是一些后端依赖的对象,例如
在python文件中,类对象是StringIO
对象
buf = io.BytesIO()
plt.savefig(buf, format='jpg')
buf.seek(0)
im = Image.open(buf)
从python文档来看,它更有意义:-
内存流:也可以使用str或字节,如
对象作为文件进行读取和写入。弦乐
可以像在文本模式下打开的文件一样使用。BytesIO可以像这样使用
以二进制方式打开的文件。两者都提供完整的读写功能
具有随机访问功能
示例代码:(内存中的)
参考:
3. 您可以使用:
plt.savefig('name.png')
您可以将其保存到“内存中”缓冲区,如下所示:
image = plt.imshow(list, interpolation=None)
# Save PNG to memory buffer as BytesIO
from io import BytesIO
buffer = BytesIO()
plt.savefig(buffer,format='png')
PNG = buffer.getvalue()
如果您的意思是希望从中获得PIL/枕头图像:
reloadedPILImage = Image.open(buffer)
下面是的一个改编,用于处理两个数据列表。
请注意,当图像的数据范围不同时,该范围将取自绘制的第一个元素。解决方法是将vmin和vmax显式设置为全局最小值和最大值
从matplotlib导入pyplot作为plt
从matplotlib导入动画
将numpy作为np导入
x、 y=np.meshgrid(np.linspace(0,5,30),np.linspace(0,5,10))
列表1=[np.sin(x+i*0.10)*np.cos(y+i*0.01)表示范围(50)内的i]
列表2=[np.cos(x+i*0.01)*np.sin(y+i*0.10)表示范围(50)内的i]
list1[0]=np.zeros_like(list1[0])#测试第一个元素只有一种颜色时会发生什么
图=plt.图()
ax1=图add_子批次(2,1,1)
vmin1=min([l.min()表示列表1中的l])
vmin2=min([l.min()表示列表2中的l])
vmax1=max([l.max()表示列表1中的l])
vmax2=max([l.max()表示列表2中的l])
ax2=图add_子批次(2,1,2)
im1=ax1.imshow(列表1[0],插值=None,动画=True,vmin=vmin1,vmax=vmax1)
im2=ax2.imshow(列表2[0],插值=None,动画=True,cmap='inferno',vmin=vmin2,vmax=vmax2)
def updatefig(一):
im1.set_数组(列表1[i])
im2.set_数组(列表2[i])
返回im1,im2,
ani=animation.FuncAnimation(图,updatefig,frames=len(列表1),interval=20,blit=True)
plt.show()
我不想将其作为文件,我需要一个图像对象,以将其保存在列表中。@Dusty:检查示例谢谢,但这对我没有帮助。我需要用很多图来做这件事,我以前无法将它们保存为文件。难道没有简单的方法吗?这不是一个基本的需要吗?@Dusty.:让我检查一下文档。我不明白的是:如果我用一个imshow()绘图就可以很容易地完成。难道不应该也有一个小地块的情节吗?我需要这些图像来制作动画。我不想将其作为文件,我需要一个图像对象,以将其保存在列表中。我想创建一个包含多个情节的动画,并将其渲染为视频。也许我的方法一开始就错了。我怎么做,是个大问题。对于单个imshow绘图,我可以将所有图像保存在列表中,然后使用matplotlib动画渲染视频。我将所有图像保存在图像列表中,然后执行动画:anim=animation.ArtistAnimation(图,图像,间隔=15,blit=True)
我不熟悉这个话题,我担心我做错了什么。谢谢你更新这个问题。现在这是一个完全不同的问题。我创造了一个更清楚理解的新问题。谢谢你的时间,这不管用。它只是呈现我列表的第一个元素,因为im1=ax1.imshow(list1[0],interpolation=None,animated=True)
只有列表的第一个元素被一次又一次地绘制出来。这是有道理的,因为im1和im2被定义为第0个元素的绘图。问题在于:im1=ax1.imshow(list1[0],interpolation=None,animated=True)
atlist1[0]
。我尝试了很多,但是我不能让它正常工作。它在updatefig中循环很好。但打印始终与第一个列表项一起打印。在您的示例链接中,使用了一个函数:im=plt.imshow(f(x,y),animated=True)
。这可能也是我所需要的。我没有运行Python 2。你为什么这么想?