在桌面级操作体系中,下载一个截图软件就能完成截屏操作,但在嵌入式Linux体系中,要完成小小的截图功用却没有那么简略。本文为您介绍嵌入式Linux体系中完成截屏功用的办法和过程。
1 . 原理
因为 Linux 体系的 FrameBuffer 机制,会把屏幕上的每个点映射成一段线性内存空间,程序就能够经过改动这段内存的值来改动屏幕上某一点的颜色。屏幕颜色的原始数据保存在/dev/fb0文件内,因而咱们能够直接cat /dev/fb0 > fb.raw读取该文件取得数据。

图1 原始截屏数据
明显,这种原始数据无法经过简略的东西直接检查,特别是在精简的嵌入式Linux体系上。因而,咱们找到了一个不错的东西——gsnap。这个东西能够将framebuffer中的数据直接保存为png或许jpeg格局的图片。当然,咱们需求取得该东西的源码,而且在穿插编译后移植它。
2 . 原材料
本次测验笔者挑选周建功/致远电子开源开发套件EasyARM-i.MX283A3,宿主机选用Ubuntu14.04。首要,咱们需求获取gsnap源码,该源码可在网络中查找下载。源码解压后得到的文件如图2:

图2 gsnap源码
其间gsnap.c为解析算法,感兴趣的读者能够翻开研讨,本文咱们不做剖析。咱们直接翻开跟编译相关的Makefile文件,内容如下。从下图可知,该源码依靠libpng、libjpeg、zlib、libmath四种库。因为穿插编译器的库种包括有libmath,因而咱们需求准备好别的三种库备用。

图3 gsnap的Makefile
解压后得到的文件如图4。(源码包可从库官网或论坛下载)

图4 库的源码包解压
3 . 穿插编译
第一步,穿插编译libjpeg。进入到源码目录,履行./configure –host=arm-linux –prefix=/home/vmuser/gsnap/jpeg_install/,然后履行make、make install ,在装置目录/home/vmuser/gsnap/jpeg_install/得到穿插编译过的库。

图5 穿插编译libjpeg
第二步,穿插编译zlib。因为zlib是libpng的依靠,因而有必要首要编译zlib。因为zlib中的configure并未供给–host参数,因而需求为它手动指明穿插编译器:export CC=arm-fsl-linux-gnueabi-gcc,然后履行./configure —
prefix=/home/vmuser/gsnap/z_install/,make、make install 。得到的文件类同第一步,不再放图。
第三步,穿插编译libpng。与上述两过程又不同,libpng中供给有Linux平台下的Makefile例程,咱们能够直接拿来修正运用。进入到libpng的源码目录,履行复制cp scripts/makefile.linux Makefile,然后翻开Makefile修正,如图6。修正的内容为穿插编译器称号和依靠的zlib的途径。最终make、makeinstall得到头文件可库文件。

图6 修正libpng的Makefile
第四步,穿插编译gsnap。为便利起见,咱们将上述得到的库文件和头文件别离会集复制到自行树立的lib和includes目录下,而且修正gsnap的Makefile。履行make后就能得到可履行文件gsnap。

图7 修正gsnap的Makefile
4 . 验证
将得到的gsnap可履行文件复制到方针板的/opt目录下,履行截屏指令:./gsnap fb.jpg /dev/fb0,将得到的截屏fb.jpg复制到ubuntu中可得图8。

图8 截屏得到的图片