历史上的今天
返回首页

历史上的今天

今天是:2024年11月01日(星期五)

正在发生

2018年11月01日 | 技术文章:嵌入式Linux中如何进行截屏?

2018-11-01

在桌面级操作系统中,下载一个截图软件就能实现截屏操作,但在嵌入式Linux系统中,要实现小小的截图功能却没有那么简单。本文为您介绍嵌入式Linux系统中实现截屏功能的方法和步骤。

 

1 . 原理

 

由于 Linux 系统的 FrameBuffer 机制,会把屏幕上的每个点映射成一段线性内存空间,程序就可以通过改变这段内存的值来改变屏幕上某一点的颜色。屏幕色彩的原始数据保存在/dev/fb0文件内,因此我们可以直接cat /dev/fb0 > fb.raw读取该文件获得数据。

 

image.png?imageView2/2/w/550

 图1  原始截屏数据

 

显然,这种原始数据无法通过简单的工具直接查看,特别是在精简的嵌入式Linux系统上。因此,我们找到了一个不错的工具——gsnap。这个工具可以将framebuffer中的数据直接保存为png或者jpeg格式的图片。当然,我们需要获得该工具的源码,并且在交叉编译后移植它。

 

2 . 原材料

 

本次尝试笔者选择周立功/致远电子开源开发套件EasyARM-i.MX283A3,宿主机选用Ubuntu14.04。首先,我们需要获取gsnap源码,该源码可在网络中搜索下载。源码解压后得到的文件如图2:

 

image.png?imageView2/2/w/550

 2  gsnap源码

 

其中gsnap.c为解析算法,感兴趣的读者可以打开研究,本文我们不做分析。我们直接打开跟编译相关的Makefile文件,内容如下。从下图可知,该源码依赖libpng、libjpeg、zlib、libmath四种库。由于交叉编译器的库种包含有libmath,因此我们需要准备好另外三种库备用。

 

image.png?imageView2/2/w/550

 图3  gsnap的Makefile

 

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

 

image.png?imageView2/2/w/550 

4  库的源码包解压

 

3 . 交叉编译

 

第一步,交叉编译libjpeg。进入到源码目录,执行./configure --host=arm-linux --prefix=/home/vmuser/gsnap/jpeg_install/,然后执行make、make install ,在安装目录/home/vmuser/gsnap/jpeg_install/得到交叉编译过的库。

 

image.png?imageView2/2/w/550

 图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得到头文件可库文件。

 

image.png?imageView2/2/w/550

 6  修改libpng的Makefile

 

第四步,交叉编译gsnap。为方便起见,我们将上述得到的库文件和头文件分别集中拷贝到自行建立的lib和includes目录下,并且修改gsnap的Makefile。执行make后就能得到可执行文件gsnap。

 

image.png?imageView2/2/w/550

 图7  修改gsnap的Makefile

 

4 . 验证

 

   将得到的gsnap可执行文件拷贝到目标板的/opt目录下,执行截屏命令:./gsnap  fb.jpg?imageView2/2/w/550  /dev/fb0,将得到的截屏fb.jpg?imageView2/2/w/550拷贝到ubuntu中可得图8。

 

image.png?imageView2/2/w/550

 8  截屏得到的图片

 

 

 

 

 

 


推荐阅读

史海拾趣

Aromat Corp公司的发展小趣事

在快速发展的过程中,Aromat Corp始终关注社会责任。公司积极参与公益活动,支持教育事业和环保事业。同时,Aromat Corp还注重员工的成长与发展,提供良好的工作环境和福利待遇,激发员工的创新精神和团队合作精神。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实的基础。

这五个故事只是虚构的Aromat Corp公司的发展概况,并不代表任何真实公司的实际情况。每个公司的发展历程都是独一无二的,受到市场环境、技术趋势、管理决策等多种因素的影响。

超霸(GP)公司的发展小趣事

绿索超容深知品质是企业生存的根本。因此,公司从原材料采购到生产制造,再到成品检验,都实施了严格的质量控制措施。此外,公司还通过了ISO9001体系认证,进一步提升了其产品质量管理水平。这些努力不仅保证了绿索超容产品的优良品质,也为其赢得了客户的信任和好评。

Ava Electronics Corp公司的发展小趣事

随着市场的不断发展,AVA电子意识到只有不断创新才能在竞争中保持领先。于是,公司加大了在研发方面的投入,引进了一批高素质的研发人才,并与多所高校和研究机构建立了合作关系。经过数年的努力,AVA电子成功研发出了一系列具有自主知识产权的电子产品,这些产品在性能、稳定性和用户体验等方面都达到了行业领先水平。这些创新产品的推出,不仅提升了公司的市场地位,也为公司带来了可观的利润。

Beckhoff Automation GmbH公司的发展小趣事

随着电子行业的全球化趋势日益明显,BCD Semi公司积极拓展国内外市场,与众多知名企业建立了紧密的合作关系。公司通过与合作伙伴共同研发、生产和销售半导体产品,实现了资源共享和优势互补,进一步提升了市场竞争力。同时,BCD Semi还积极参加国际电子展会和交流活动,展示公司的最新技术和产品,为公司的品牌建设和市场拓展奠定了坚实的基础。

台湾诚阳(BC)公司的发展小趣事

在电子行业的激烈竞争中,台湾诚阳(BC)公司凭借其对技术的敏锐洞察和持续创新,成功研发出一款具有颠覆性的电子产品。这款产品不仅具有高性能和稳定性,还集成了多项前沿技术,满足了市场对于高效、便捷的需求。凭借这一创新产品,台湾诚阳迅速在市场中脱颖而出,赢得了众多客户的青睐。

Ferranti Electric Inc公司的发展小趣事

随着技术的不断发展和创新,Ferranti Electric Inc公司在电气领域取得了显著的成就。特别是在设计和制造用于恶劣气候或关键安全领域的复杂、高可靠性电气产品方面,公司展示了其卓越的技术实力。这些产品不仅广泛应用于军用领域,同时也为民用领域提供了大量电气产品解决方案。公司的全球影响力逐渐扩大,产品远销世界各地。

问答坊 | AI 解惑

很想知道学会了单片机研发,工资一般能拿多少啊?能达到6000吗?

很想知道学会了单片机研发,工资一般能拿多少啊?能达到6000吗?…

查看全部问答>

18B20传感器

18B20温度传感器中文资料…

查看全部问答>

电路设计技术与技巧(第二版)国外牛人Tim Williams著

国际电子大侠Tim Williams(蒂姆·威廉斯)著 内容简介 本书较全面和系统地讲述了在实际电子电路设计中常见问题和容易忽视的方方面面, 涵盖了设计产品所需是的全面知识,包括印制电路板布线和接地、有源和无源器件、模拟和数字集成电路、电源、电 ...…

查看全部问答>

【FPGA 代码】

持续赋值方式定义的2 选1 多路选择器module MUX21_1(out,a,b,sel);input a,b,sel;output out;assign out=(sel==0)?a:b;//持续赋值,如果sel 为0,则out=a ;否则out=bendmodule阻塞赋值方式定义的2 选1 多路选择器module MUX21_2(out,a,b,sel);inpu ...…

查看全部问答>

问一个笨笨的问题

请问如何在EVC build后执行某个PC上的EXE文件. 比如,我要在build aa.exe后自动调用bb.exe. 我在post-build里设置,总是不成功.…

查看全部问答>

串口通信

我现在用RS232进行PC机和单片机的通信,在用串口调试助手的时候,发现单片机发送回来的数据是乱码,请问这是什么原因?…

查看全部问答>

地址卷绕

想问下,地址卷绕是一种什么概念啊!好像发生在运算结果上溢出和下溢出时候的!…

查看全部问答>

WINCE6.0操作系统在三星6410开发板上完美展现!--基于立宇泰ARMSYS6410开发板

精彩测评实例图片说明:1,WINCE6.0系统启动画面(进度条动态显示内核加载进程,LOGO图片可以根据客户需要免费更换);2,WINCE6.0桌面效果;3,800x480液晶屏全屏播放H.264视频流文件(采用硬件解码)4,800x480液晶屏全屏播放MPEG4(avi后缀)音视 ...…

查看全部问答>

STM32用到的TFT屏幕资料及例程.欢迎补充

既然有人需要TFT屏 资料.放假在家也没什么事.整理一下自己手头有的吧.做个抛砖引玉.希望大家能吧自己方便分享的资料都上传上传~…

查看全部问答>

Ecan通信的中断问题

       本人在一个项目中运用Ecan进行通信,在通信过程中会碰到中断故障(具体原因说不上来)。我是将Ecan设置成中断接收的(邮箱0-15设置成接收邮箱,16邮箱设置成发送邮箱),若接收到一个合理的读写命令,则返回 ...…

查看全部问答>