標籤:

Matlab如何實現截屏與屏幕錄製

這幾個月,寫過幾篇帖子,有關於如何製作動圖的「Matlab如何動態呈現計算結果」,關於如何提取曲線原始數據的「Matlab如何從曲線圖中提取原始數據」等等,些許朋友在知乎里甩下兩句話,然後人就不見了,大意是某某軟體就能實現這個功能,沒必要寫這個工具。

我當然明白,這些朋友肯定是沒有惡意的,我也非常感謝他們。很長時間以來,我也沒有好好聊聊,為什麼我要寫這些工具。

最初的想法很簡單,單純的只是想通過自己寫腳本來實現自己的需求,然後慢慢的把電腦里安裝的軟體卸載掉。如果有幸有一天,我實現了電腦里只剩下Matlab的話,於我而言,值了。

再後來逛知乎,漸漸了解到,有個詞叫造輪子。用知乎網友@王子亭的話來說,造輪子就是,明知道你做的不可能比前輩做得更好,卻仍然堅持要做。而造輪子的意義在於,能夠增加自己的經驗,很多事情看起來很簡單,但只有自己動手,才會發現其中的難點。

這幾天閑暇之餘,我又造了回輪子,是關於截屏與錄屏的功能的。為了避免再有朋友提醒什麼軟體能夠實現功能的尷尬情況,在這裡,我介紹一下,之前我一直是通過Screenpresson這款軟體實現截屏與錄屏的。

首先展示一下,我所寫的工具的整體效果。

下面這幅圖是整個工具的界面,其中所包含的功能有:

  • 設置截屏或錄屏區域大小
  • 截圖功能
  • 設置錄屏幀數
  • 開始錄屏
  • 暫停錄屏
  • 停止錄屏
  • 保存錄屏以及選擇保存文件的格式
  • 顯示錄屏結果

整體的使用效果將會通過下面兩幅動圖來說明:

1. 工具實現截屏的功能

2. 工具實現錄屏的功能

那麼回到造輪子的意義,今天就來聊一聊在製作這個工具的過程中,都存在哪些細節難點,而我又從中獲得了什麼。

1. 如何實現截圖

曾經我寫過一篇帖子「【一個被斃掉的作品】如何評估一隻股票的買點」,是關於產品評估的工具,在這個工具中,我就曾使用過截屏的功能,正如這篇帖子中所言,我所使用的是

java.awt.Robot

這部分代碼,Matlab論壇中也有不少帖子進行介紹,在這裡就不再過多講解,有興趣的朋友可以去論壇拿代碼嘗試一下。

2. 如何實現截屏區域大小的設置

對於區域大小設置這個問題,正如動圖中所展示的,我是通過新增一個窗體,並手動調整該窗體大小來實現截屏區域大小的設置,最終通過獲取該窗體的OuterPosition,能夠得到一個1行4列的矩陣,其中各元素的意義依次為橫坐標,縱坐標,長度以及高度。

截圖功能中,是通過下述代碼實現截圖區域的設定

java.awt.Rectangle(x,y,length,height);

其中需要注意的一點是,雖然同樣是設定橫縱坐標,長度及高度,不過窗體所獲取的位置信息與截圖函數中的位置信息,兩者的坐標系是不一致的。在下面這幅圖中,紅框表示屏幕,紅色箭頭所標識的分別為截圖功能坐標系的橫縱坐標,而藍色箭頭所標識的分別為窗體獲取位置的橫縱坐標。兩者之間需要通過一個換算,而對於長度與高度而言,都是一致的。

3. 如何實現錄屏

錄屏的本質,其實就是以一定的時間間隔對所設定的區域進行截屏,最終再以相應的時間間隔將所有截取的圖片進行整合。對於這部分,我曾經寫過一篇帖子「Matlab如何動態呈現計算結果」,是關於如何製作動圖的,可以參考這篇帖子進行製作。

4. 如何實現錄屏的暫停與終止

在錄屏功能中,是通過一個while函數實現一個循環截屏,因此實現錄屏的暫停或終止,關鍵在於如何使得while循環終止。

對於這個需求,我的處理方式是,定義一個全局參數,並初始化為true,並且該while循環的條件是,該全局參數為true便一直循環。直到stop按鈕觸發該全局參數為false,那麼while循環將會跳出。在這部分邏輯,暫停與終止的處理方式都是相同的。

而暫停與終止兩項功能的不同之處在於,終止功能觸發之後,截圖計數將會複位為1,也就是說,下一次在再start的時候,就是一個重新錄屏的過程。而暫停功能觸發之後,截圖計數不做任何操作,下一次再start的時候,就是一個繼續錄屏的過程。

上述幾點,就是我在寫整個工具過程中,比較有意思的幾點收穫。對此有興趣的朋友,不妨也嘗試一下。

以上

如果你有興趣,歡迎關注我的微信公眾號「打浦橋程序員」,謝謝


推薦閱讀:

TAG:MATLAB |