偷拍 Framebuffer 的風流韻事
Linux 下的螢幕抓圖,多半以 Xorg/X11 底下的實作居多,有數不清的工具可以使用,但這都僅限於一般 PC 上的範疇。有許多 Embedded System 不外乎就是小而美,這種小裝置上若要跑上 Xorg,有時便不是這麼容易,因此在多數情況下 Framebuffer 才是顯示影像的主流方法。那麼我們是否可以,來實作一下 Framebuffer 的抓圖呢?嘗試著偷拍這種針孔型裝置的畫面。 :-P 這是一支簡單的程式(screenshot.c),會將 Framebuffer 的影像資料從記憶體中取出並存成 screenshot.jpg: #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <linux/fb.h> #include <jpeglib.h> void savetojpeg(unsigned char *img, int width, int height) { unsigned char *buffer, *src, *dest; unsigned char *line; int length; int i, line_length; FILE *fp; struct jpeg_compress_struct jpeg; struct jpeg_error_mgr jerr; /* setting error output */ jpeg.err = jpeg_std_error(&jerr); /* create jpeg */ jpeg_create_compress(&jpeg); /* setting image */ jpeg.image_width = width; jpeg.image_height = height; jpeg.input_components = 3; ...