不得不在这里插话,因为当我寻求帮助时,这是我在 Google 上的最高搜索结果。我对这两个答案都有问题,还有其他一些问题。值得注意的是:
- 对于Rick T's answer,截断的代码不会写出绘图图形,它只是写矩阵数据。获取绘图窗口很痛苦。
- 对于 carandraug's answer,写入 PDF 花费了很长时间,并制作了一个巨大的 PDF。
- 在我自己的机器上,我非常确定我使用 apt-install 来获取 Octave,但是我在其他答案中找到的
getframe 函数没有找到。原来我安装了 4.4 版,它是 2018 年(>3 岁)的版本。
我删除了旧版本的 Octave sudo apt remove octave,然后使用 snap 安装了新版本。如果您在未安装终端的情况下尝试 octave,它应该会提示您进行 snap install - 请务必包含 # 6.4.0 或命令中包含的任何内容。
一旦我安装了当前版本,我就可以访问getframe 命令,这使您可以直接从图形句柄转换为图像数据 - 这绕过了@carandraug 答案中的 hackey(但以前必要的步骤)您必须在其中写入 PDF 或其他图像作为占位符。
我使用@RickT 的答案制作了我自己的MakeGif 函数,我将在这里与大家分享。请注意,MakeGif 将文件名存储在一个持久变量中,这意味着它会在调用之间保留。如果您更改文件名,它将生成(或覆盖!!)新文件。如果您需要覆盖当前文件(即多次运行相同的脚本并想要新的结果),那么您可以在调用之间使用clear MakeGif,这将重置persistentFilename。
这是 MakeGif 函数的代码;在此之后提供了测试它的代码:
function MakeGif(figHandle, filename)
persistent persistentFilename = [];
if isempty(filename)
error('Can''t have an empty filename!');
endif
if ~ishandle(figHandle)
error('Call MakeGif(figHandle, filename); no valid figHandle was passed!');
endif
writeMode = 'Append';
if isempty(persistentFilename)|(filename!=persistentFilename)
persistentFilename = filename;
writeMode = 'Overwrite';
endif
imstruct = getframe(figHandle);
imwrite(imstruct.cdata, filename, 'gif', 'WriteMode',writeMode,'DelayTime',0);
endfunction
这是测试功能的代码。在蓝色和绿色之间有一个对clear MakeGif 的注释调用。如果您将其注释掉,它会将绿色正弦波附加到蓝色正弦波上,从而在每个周期后产生交替颜色 - 文件名再次在函数中保持不变。如果您取消注释该调用,则 MakeGif 函数会将绿色的调用视为“新”并触发蓝色正弦波的覆盖,您将看到的只是绿色。
clear all;
time = 0:0.1:2*pi;
nSamples = numel(time);
figHandle = figure(1);
for i=1:nSamples
plot(time,sin(time + time(i)),'Color','blue');
drawnow;
MakeGif(figHandle, 'test.gif');
endfor
% Uncomment the 'clear' command below to clear the MakeGif persistent
% memory, which will trigger the green sine wave to overwrite the blue.
% Default behavior is to APPEND a green sine wave because the filename
% is the same.
%clear MakeGif;
for i=1:nSamples
plot(time,sin(time + time(i)),'Color','green');
drawnow;
MakeGif(figHandle, 'test.gif');
endfor
在对延迟的屏幕截图非常不满意后,我花了几个小时在这上面,所以我真的希望这对未来的人有所帮助!祝你好运和来自 Covid 时代的良好祝愿哈哈。