Back to Raspberry Pi Taiwan

【教學/常見問與答】如何在 Raspberry Pi 上擷取畫面?

Last Updated on 2022 年 7 月 19 日 by 小編

X Window

Linux 環境下常用抓圖軟體

如何在 Raspberry Pi 上擷取畫面 一直是使用樹莓派的問題。如果是在 X Window 下,最簡單的方式是安裝 shutter,但這有兩個缺點,就是 shutter 相依的套件太多,所以光是截圖這個小功能就需要安裝將近 90MB 的套件,並且執行起來很慢,但使用最容易。

安裝 shutter

1. 先安裝必要套件

pi@raspberrypi:~$ sudo apt-get install shutter

2. 從主要功能選單(main-menu)叫起來

shutter shortcut

3. 執行區域性的截圖、或是全螢幕的截圖等功能

shutter capture window

如果覺的 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)下。
X Window

 

使用 /dev/fb0 裝置截圖

如果是在 console 底下 可以透過 cat /dev/fb0 > snapshot.rawframebuffer 的資料轉存為 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

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 超級比一比

最後比較一下 raspi2pngfb2png,底下是相同時間的擷取結果,可以發現 raspi2png 是根據 VideoCore API 的 vc_dispmanx_display_get_info 傳回螢幕解析度,因此雖我們已經將 framebuffer 的解析度調整成 800×600,但是因為我們用的螢幕解析度是 1280×800,因此最後還是抓下 1280×800 的截圖。
raspi2png snapshot

fb2png 則是開啟 /dev/fb0 的裝置檔,並根據 fb_var_screeninfo 回傳 framebuffer 的 xres 和 yres,因此最後截圖結果會是 800×600 的解析度,比較符合我們想要的結果。
fb snapshot

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Back to Raspberry Pi Taiwan