【教學/常見問與答】如何在 Raspberry Pi 上擷取畫面?
Last Updated on 2022 年 7 月 19 日 by 小編
內容目錄
Linux 環境下常用抓圖軟體
如何在 Raspberry Pi 上擷取畫面 一直是使用樹莓派的問題。如果是在 X Window 下,最簡單的方式是安裝 shutter
,但這有兩個缺點,就是 shutter 相依的套件太多,所以光是截圖這個小功能就需要安裝將近 90MB 的套件,並且執行起來很慢,但使用最容易。
安裝 shutter
1. 先安裝必要套件
pi@raspberrypi:~$ sudo apt-get install shutter
2. 從主要功能選單(main-menu)叫起來
3. 執行區域性的截圖、或是全螢幕的截圖等功能
如果覺的 shutter
不適合,還可以用 scrot + openbox,之後就可以按 PrtSc 按鍵直接做 snapshot。有關 scrot
的使用方式可以參考這篇。
安裝 scrot
1. 先安裝必要套件
pi@raspberrypi:~$ sudo apt-get install scrot
2. 增加按鍵的繫結(key binding)
目的是將 keybind 的定義放在 <keyboard> 和 </keyboard> 之間
pi@raspberrypi:~$ vi ~/.config/openbox/lxde-rc.xml
<keybind key="Print"> <action name="Execute"> <command>scrot</command> </action> </keybind>
3. snapshot
進到桌面環境下,按 PrtSc 按鍵做 snapshot,擷取畫面的預設路徑是放在家目錄(/home/pi)下。
使用 /dev/fb0 裝置截圖
如果是在 console 底下 可以透過 cat /dev/fb0 > snapshot.raw
將 framebuffer 的資料轉存為 RGB565 的 raw 檔。但如果要用 Eye 等看圖軟體讀取,就需要將 raw 檔透過 FFmpeg 等軟體先轉為 PNG 或是 BMP 等格式。
使用 raspi2png 軟體
幸運的是,我們也可以透過 vc_dispmanx_snapshot 這個函式取得目前螢幕的狀態。
Andrew Duncan 已經寫成成執行檔,下載後編譯就可以在 console 底下隨時擷取螢幕畫面。
1. 先安裝必要套件
pi@raspberrypi:~$ sudo apt-get install libpng12-dev
2. 下載 raspi2png 原始碼
pi@raspberrypi:~$ git clone https://github.com/AndrewFromMelbourne/raspi2png.git
3. 編譯 raspi2png
pi@raspberrypi:~$ cd raspi2png pi@raspberrypi:~$ make
4. 使用 raspi2png
不加任何參數時預設是存成 png 格式的檔案
pi@raspberrypi:~$ ./raspi2png
可用的參數有以下幾種,當然這指令也可以在X Window下執行。
--pngname - 抓圖後的存檔名稱(預設是 snapshot.png ) --verbose - 顯示完整資訊 --height - 圖片高度(預設是螢幕的高度) --width - 圖片寬度(預設是螢幕的寬度) --type - 圖片的色彩格式,可用的格式為 RGB565 RGB888 RGBA16 RGBA32 --delay - 多久後擷取(預設是0,立刻執行)
使用 fb2png 軟體
最後,我們最喜歡用的其實是同一個作者的 fb2png。這程式可以讀取 framebuffer 並直接儲存成 png 格式的檔案。
1. 先安裝必要套件
pi@raspberrypi:~$ sudo apt-get install libpng12-dev
2. 下載 fb2png 原始碼
pi@raspberrypi:~$ git clone https://github.com/AndrewFromMelbourne/fb2png.git
3. 編譯 fb2png
pi@raspberrypi:~$ cd fb2png pi@raspberrypi:~$ make
4. 使用 fb2png
pi@raspberrypi:~$ ./fb2png
raspi2png 和 fb2png 超級比一比
最後比較一下 raspi2png
和 fb2png
,底下是相同時間的擷取結果,可以發現 raspi2png
是根據 VideoCore API 的 vc_dispmanx_display_get_info 傳回螢幕解析度,因此雖我們已經將 framebuffer 的解析度調整成 800×600,但是因為我們用的螢幕解析度是 1280×800,因此最後還是抓下 1280×800 的截圖。
而 fb2png
則是開啟 /dev/fb0
的裝置檔,並根據 fb_var_screeninfo 回傳 framebuffer 的 xres 和 yres,因此最後截圖結果會是 800×600 的解析度,比較符合我們想要的結果。
發佈留言