分享网路上找到取代getframe的方法,因为getframe会跳出视窗,大量画图做动画时萤幕
就被matlab绑架了。
%==原本使用getline的code==%
vidObj = VideoWriter([name '.avi']); %打开动画
open(vidObj);
for t=1:5000
h = figure('visible','off');
画图; 设轴; balabala; 画好了;
F = getframe; %这里会跳出视窗,visible off没用
writeVideo(vidObj,F); %把frame写进动画档
end
close(vidObj); %关闭动画
%==不使用getline的code==%
vidObj = VideoWriter([name '.avi']); %打开动画
open(vidObj);
for t=1:5000
h = figure('visible','off');
画图; 设轴; balabala; 画好了;
F1 = im2frame(zbuffer_cdata(gcf)); %函式在下一页
writeVideo(vidObj,F1); %把frame写进动画档
end
close(vidObj); %关闭动画
%==另外写一个zbuffer_cdata.m==%
function cdata = zbuffer_cdata(hfig)
% Get CDATA from hardcopy using zbuffer
% Need to have PaperPositionMode be auto
orig_mode = get(hfig, 'PaperPositionMode');
set(hfig, 'PaperPositionMode', 'auto');
cdata = hardcopy(hfig, '-Dzbuffer', '-r0');
% Restore figure to original state
set(hfig, 'PaperPositionMode', orig_mode);
end
下面讲使用时理解的概念,我是新手,有错请指证我。不看概念直接用其实没差。
用 im2frame 取代 getframe,但是如果写 F2 = im2frame(cdata,cmap);
这时候 writeVideo(vidObj,F2) 会出错,因为F2和F=getframe的F的结构不一样。
F2的结构是两层,第一层cdata,依自己画图矩阵大小(n by n)而定,
第二层是cmap,大小m*3。
F的结构也是两层,第一层是( n by n by 3 ) 矩阵後面接着对应的RGB颜色,
第二层是空的。
所以必须再写一个函式,先传入gcf(get current figure),此时结构就是(n by n by 3)
,然後用hardcopy直接取出cdata(n by n by 3),F1 = im2frame(cdata);
这时候F1的第一层是(n by n by 3),第二层是空的。
至於为什麽要把 PaperPosotionMode 设为auto再取cdata,我还不知道...
如果 writeVideo(vidObj,gcf); 结果画出小张、边变宽的动画,我也不知道为什麽...
原文
http://goo.gl/cdPAEh
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.115.114.21
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/MATLAB/M.1413348900.A.00C.html
※ 编辑: ruby60307 (140.115.114.21), 10/15/2014 13:00:54