分享網路上找到取代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://www.ptt.cc/bbs/MATLAB/M.1413348900.A.00C.html
※ 編輯: ruby60307 (140.115.114.21), 10/15/2014 13:00:54