我正在尝试创建一个将动画情节导出为视频格式的功能。这个图是一个 qt 小部件。我相信第一步是将单个图像转换为字节数组或枕头图像或类似的东西,但我不知道该怎么做。在此之后,我认为后续图像应该保存并一起添加到一个视频中。
我尝试调整以下导出单个图像的程序:
import pyqtgraph as pg
import pyqtgraph.exporters
# generate something to export
plt = pg.plot([1, 5, 2, 4, 3])
# create an exporter instance, as an argument give it
# the item you wish to export
exporter = pg.exporters.ImageExporter(plt.plotItem)
# save to file
exporter.export('fileName.png')
来自这个网站。但是我无法将其存储在变量中而不是将其导出到 png 文件。有谁知道如何做到这一点,或者如何导出不断变化的 qt 小部件的图像序列?
我做了以下功能,首先将 plot_widget 的快照存储为 QPixMap,然后将其转换为 QImage,然后将其转换为枕头图像。然后使用 imageio 将此图像列表转换为 mp4 文件。 (我只能用 PIL 获取 gif,那些对我来说太慢了)
import io
from PIL import Image
from PySide6.QtCore import QBuffer
from PySide6.QtWidgets import QApplication # usecase specific
import imageio
import pyqtgraph as pg # usecase specific
def current_img(plot_widget): # returns current widget as PIL Image
pix_map = plot_widget.grab()
q_img = pix_map.toImage()
buffer = QBuffer()
buffer.open(QBuffer.ReadWrite)
q_img.save(buffer, "PNG")
return Image.open(io.BytesIO(buffer.data()))
app = QApplication()
plot_window = pg.PlotWidget() # my specific usecase
filename = "file_location"
imgs = []
while len(imgs) < 120:
imgs.append(current_img(plot_window))
# insert code that adjusts plot_window
imageio.mimsave(f"{filename}.mp4", imgs, fps=30)
它做我想做的事,但由于它保存了大量图像以获得不错的绘图质量,所以速度非常慢。所以我将测试其他选项,看看它们是否更快,所以如果有人知道另一种(更快)的方法,请分享。