嵌入式截屏工具-gsnap移植 arm平台

news/2025/1/10 17:05:30/文章来源:https://www.cnblogs.com/sunisnyu/p/18664301
# 目录
- [前言](#前言)
- [正文](#正文)- [原理](#原理)- [环境](#环境)- [详细流程](#详细流程)- [使用](#使用)
- [参考](#参考)# 正文
## 原理
### 前提条件:
嵌入式机器要支持`/dev/fb0`这个设备节点。不然,这个工具基本就使用不了了。### 原理:
由于 Linux 系统的 FrameBuffer 机制,把屏幕上的每个点映射成一段线性内存空间,这样,程序就可以通过改变这段内存的值来改变屏幕上某一点的颜色。如果我们想把当前的显示内容保存起来,可能会想到如下命令:```bash
cat /dev/fb0 > fb_data.raw

反过来,可以将这些数据回显到 framebuffer 中:

cat fb_data.raw > /dev/fb0

但是,用这用方法保存起来的数据是原始数据,只有专用软件才能打开,并且大小固定(如:8MB)。基于这些原因,我们找到一个不错的工具——gsnap,这个工具可以将 framebuffer 的数据保存为图片(png或jpeg格式)。

环境

交叉编译的主机为Ubuntu 16.04

使用的交叉编译器为: arm-linux-gnueabihf-gcc
交叉编译器的下载地址为: https://blog.51cto.com/u_15127589/4102404
我这边直接选择的版本就是最新的:
安装方式就直接在root下面执行: sudo apt install gcc-arm-linux-gnueabihf

arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabihf/6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 6.3.
Thread model: posix.........
gcc version 6.3.0 20170516 (Debian 6.3.0-18) 
root@debian:/home/gsnap_build_all_src/install#

测试方式: arm-linux-gnueabihf-gcc -v

gsanp的源码以及一些依赖库的链接如下:

  • 蓝奏云 密码:fbmm

详细流程

首先,进入那个资源文件夹中可以看到:
alt text
建议你们是把出.tar.gz的其他文件都先删掉。因为那些是我解压且修改后的文件。你要是用那些,有可能自己的编译器有问题,都没有发现。

首先,在这个目录下创建一个install的目录,来存放生成的依赖库。
然后,将所有的.tar.gz都解压在当前目录即可。命令: tar -zxvf *****.tar.gz
各个依赖库的交叉编译次序:jpeg --> zlib --> libpng --> gsnap

 cd /work/gsnap/gsnap_build_all_src/jpeg-9dexport CC=arm-linux-gnueabihf-gcc./configure --host=arm-linux-gnueabihf --prefix=/work/gsnap/gsnap_build_all_src/install/jpegmake -j4make install

1. 编译libjpeg

在ubuntu中执行以下命令,进行交叉编译:

cd /work/gsnap/gsnap_build_all_src/jpeg-9d
export CC=arm-linux-gnueabihf-gcc
./configure --host=arm-linux-gnueabihf --prefix=/work/gsnap/gsnap_build_all_src/install/jpeg
make -j4
make install

编译成功后,在目录下生成;
alt text

2. 编译zlib

由于zlib是libpng的依赖,因此在交叉编译libpng之前,必须首先编译zlib。在ubuntu中执行以下命令,进行zlib的交叉编译:

cd /work/gsnap/gsnap_build_all_src/zlib-1.2.11
export CC=arm-linux-gnueabihf-gcc
./configure --prefix=/work/gsnap/gsnap_build_all_src/install/zlib
make -j4
make install

交叉编译zlib成功后,接着就可以编译libpng了。

3. 编译libpng

与上述的两个库编译方式不同,由于libpng源码里面提供了Linux平台的Makefile文件,因此,可以直接修改Makefile然后完成编译工作。执行以下命令,进入libpng源码目录,然后进行Makefile复制。

cd /work/gsnap/gsnap_build_all_src/libpng-1.6.37
cp scripts/makefile.linux  Makefile  -a

然后,修改Makefile相应内容:
![alt text]([img]())

# 修改Makefile中的CC和prefix
CC=arm-linux-gnueabihf-gcc
prefix=/work/gsnap/gsnap_build_all_src/install/png

然后,执行:

make -j4
make install

接下来,所有的依赖库都放在install下面了,我们可以看下;

4. 编译gsnap

接下来进入gsnap的源码,去编译编码。

a. 首先,我们进入后,修改一下Makefile。Makefile修改成这样-> 将路径修改为实际路径:

all:#$(CC) -g gsnap.c -L/usr/lib -lpng -ljpeg -lz -lm -o gsnaparm-linux-gnueabihf-gcc  -g gsnap.c \-L /work/gsnap/gsnap_build_all_src/install/png/lib \-L /work/gsnap/gsnap_build_all_src/install/jpeg/lib \-L /work/gsnap/gsnap_build_all_src/install/zlib/lib \-I /work/gsnap/gsnap_build_all_src/install/png/include \-I /work/gsnap/gsnap_build_all_src/install/jpeg/include \-I /work/gsnap/gsnap_build_all_src/install/zlib/include \-lpng -ljpeg -lz -lm -o gsnap
clean:rm -f gsnapset -i 's|/work/gsnap/|/xxx/xxx/|g' Makefile  替换为你实际路径

里面的路径注意要相对应改成你所当前环境下的。

b. 执行make all,执行完后,我们就可以看到当前文件夹下生成一个gsnap的可执行文件:

make all

接下来,将这个gsnap的可执行文件拷贝到/bin下面。

将一些依赖库拷贝到/lib目录下面。

执行以下命令,可以进行屏幕截图:

gsnap fb.jpg /dev/fb0

执行完后,你就可以在/bin的目录下找到一个fb.jpg,将其拷贝出来,就可以进行显示了。

使用

如果上面的环境下的话,应该就可以直接使用我上面所编译出来的可执行文件,将其拷贝到对应的环境中,然后将对应的库拷贝到对应的/lib环境中,从而,再执行gsnap fb.jpg /dev/fb0这句后,就可以执行进行截图操作,而不用自己进行编译。
img

参考

  1. 嵌入式截屏工具-gsnap移植
  2. 嵌入式Linux开发环境搭建-(7)嵌入式Linux开发板截屏工具gsnap移植
  3. 嵌入式Linux截图工具gsnap移植与分析
  4. ARM-Linux开发 arm-none-Linux-gnueabi-gcc下载安装
  5. make:arm-linux-gnueabihf-gcc:command not found 问题解决
  6. arm-linux-gnueabihf编译工具链安装
- 本文转载自 [嵌入式截屏工具-gsnap移植-作者:落日冬升](https://blog.csdn.net/qq_43211060/article/details/124411859)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867221.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIME2019 I

AIME2019 I 的题目订正。√√√√ √√.√√ ...√. \(= 9\) https://artofproblemsolving.com/wiki/index.php/2019_AIME_I_Problems P4 寄啦! 唐题。分讨 substitution 的次数即可。 P5 对啦! DP。 令 \(f_{x,y}\) 为走到 \((x,y)\) 的概率。边界情况为 \(f_{4,4} = 1\)。答…

通过本地私有的镜像仓库harbor解决网络原因导致的jdk无法加载而造成的docker打包错误.v2.250110

​各种网络原因,或是docker.io无法访问,或是阿里的镜像源故障,导致java打包发布的时候报错,很影响代码发布的质量。解决思路:墙出去把jdk下载下来,代码使用本地的harbor库进行引用,一劳永逸。此解决方法也适用于国外优质不频繁变动的镜像源的本地化使用。解决方法 1. 自…

[题目记录]AGC005E Sugigma: The Showdown

一道通过自己生成思路做出的思维题 . 通过分析博弈过程发现问题其实没有那么复杂 , 然后层层分析转化问题即可 .AGC005E Sugigma: The Showdown 题意 给出两棵树 , 点的编号相同 , 连边方式不同 . 初始 A 在树 \(a\) 上的点 \(x\) , B 在树 \(b\) 上的点 \(y\) , 两人轮流走 , …

代码随想论算法训练营第3天 | 链表理论基础,203.移除链表元素,707.设计链表,206.反转链表

一、刷题部分 1.1 链表理论基础原文链接:代码随想录 题目链接:🈚️链表是由一个个节点串联而成的,节点包含数据域和指针域,数据域用来存放数据,而指针域实现了节点之间的串联。 链表中有单链表、双链表、循环链表:链表的物理空间是不连续的,通过指针存储下一节点的物理…

ABAP配置:OY01 定义国家/地区

配置:OY01 定义国家/地区 事务代码:OY01 配置路径 SPRO-ABAP平台-常规设置-设置国家-定义国家/地区 配置路径截图配置描述 国家是SAP里面一个非常重要的概念,SAP国家概念涉及公司代码、工厂、主数据、跨国银行交易,系统默认自带ISO相关的国家编码,在S/4中,一些配置转移到…

关于GTM,这些评价指标你都知道吗?

目标跟踪指标是企业实现持续增长和盈利的重要工具。通过定期监控和分析这些指标,企业可以及时发现潜在问题并采取相应的改进措施,以保持其竞争力并实现业务目标。因此,企业应该重视这些指标的应用,并不断优化其监控和分析流程,以确保其业务运营的顺利进行。Goal Tracking …

ODX诊断数据库转换工具 - DDC

INTEWORK-DDC (Diagnostic Database Convertor) 是将诊断调查问卷转换为标准ODX(2.2.0)数据库的工具。ODX是格式标准化的诊断数据库文件,我们在诊断不同的车或者不同的ECU时,只需要加载适配这个车型或ECU的ODX文件即可,而无需对诊断仪做任何改变。ODX统一了诊断文件的格式,…

异地多活架构进阶:如何解决写后立即读场景问题?【转】

在《醍醐灌顶!异地多活架构设计看这篇就够了》一文中,基于容灾需要,讨论了数据写入的架构模型。数据读取方面,重点在于解决读取请求的负载分担、路由选择的问题,对于容灾架构的选择影响不大。不过,其中的“写后立即读”场景,是个一致性范畴的问题,即写入的数据和写入后…

JAVA之面向对象

1、设计对象并使用类和对象 类(设计图):是对象共同特征的描述; 对象:是真实存在的具体实例; 在java中,必须先设计类,才能获得对象。 如何得到类的对象:类名 对象名 = new 类名(); 如何使用对象: 访问属性:对象名.成员变量 访问行为:对象名.方法…

免费手动打Windows Server补丁

免费手动打Windows Server 2008 R2补丁https://catalog.update.microsoft.com/search.aspx?q=kb4474419然后到windows上双击运行即可本文来自博客园,作者:六月OvO,转载请注明原文链接:https://www.cnblogs.com/chenlifan/p/18664077

pwn1_sctf_2016 1

打开ida反汇编看一下,是c++,无所谓,复制问一下ai先让我们输入s的数据,读取长度限制在32字节。然后replace函数会将s里面的 I 替换成 you 。最后输出s。 分析一下,s距离ebp为0x3C(60字节),且我们最多只能输入32字节的,但经过replace函数,一个字节的‘I’会被替换成三个…

UDS-ECU程序刷写

UDS(unified diagnostic services)统一诊断服务主要是针对汽车上对ECU进行诊断服务规范,下图是UDS在OSI分层中的具体规范,基于UDS的刷写应用逻辑体现在应用层的ISO14229规范。一、功能介绍 UDS(unified diagnostic services)统一诊断服务主要是针对汽车上对ECU进行诊断服…