[心得] getframe會跳出視窗 解法

看板MATLAB作者時間9年前 (2014/10/15 12:55), 9年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
分享網路上找到取代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
文章代碼(AID): #1KFVua0C (MATLAB)