2016年6月18日 星期六

[Tips] 擷取framebuffer畫面

大部分嵌入式系統都會實做 framebuffer 的驅動程式介面, 如 /dev/fb0

因此要擷取畫面最簡單的方式就是
$ cat /dev/fb0 > fb.raw

再將畫面倒回去
$ sudo cp fb.raw /dev/fb0

但要注意幾點

1. framebuffer 是記憶體 raw data, 因此存檔的結果是一連串的16進位數值, 因此無法使用一般的看圖軟體開啟, 但可以透過 imagemagick 裡的 display 工具顯示(需指定顯示的解析度)
$ display -size 1024x768 rgb:fb.raw


2. 因此還原成一般的 jpg 或是 png 格式需指定 color-depth 和解析度
如果是 24-bit 可以使用 imagemagick 裡的 convert 工具
$ convert -depth 8 -size 640x480 rgb:fb.raw -channel RGB -separate -swap 0,2 -combine fb.png

如果是 16-bit, 可以使用 iraw2png 這支 perl 程式
#!/usr/bin/perl -w
 
$w = shift || 240;
$h = shift || 320;
$pixels = $w * $h;
 
open OUT, "|pnmtopng" or die "Can't pipe pnmtopng: $!\n";
 
printf OUT "P6%d %d\n255\n", $w, $h;
 
while ((read STDIN, $raw, 2) and $pixels--) {
   $short = unpack('S', $raw);
   print OUT pack("C3",
      ($short & 0xf800) >> 8,
      ($short & 0x7e0) >> 3,
      ($short & 0x1f) << 3);
}
 
close OUT;
執行 iraw2png 程式:
$ python iraw2png 640 480 fb.png

之後就可以用 gpicview 之類的軟體開啟 png 檔案了
$ gpicview fb.png

reference:
* Working with Frame Buffers
* How to do a framebuffer screenshot
* Convert raw BGRA framebuffer to RGB png file (有條件限制使用)

沒有留言: