linux下怎么用c语言获取一帧屏幕图像数据,怎么分块

author author     2023-05-01     206

关键词:

1. 利用FrameBuffer设备,用ioctl()函数获取相关屏幕信息,然后用mmap()映射,用两个for循环逐个读取
for (y = 0; y < scrinfo.yres; y++)
for (x = 0; x < scrinfo.xres; x++)
获取一帧屏幕图像数据有没有更简洁方便的方法?

2. 把屏幕图像分成4×4或16×16的块。关于这方面的网上的都是一带而过,没说具体怎么分块,怎么保存像素数据。最近在学习linux下的桌面共享,求大神指点,急

教你一个方法,你想找某个方面的资源,就在关键词后面加详解两个字,通常都能搜到。例如搜

FrameBuffer详解
就能得到你要的东西了。

至于图像分块嘛,自己用memcpy把buffer里的图像拷贝出来,自己手动写循环分块啦。分4块那就拷贝到4个内存块里啦,写的时候注意循环的下标就行了。追问

FrameBuffer了解得还行,主要是怎么分块存储像素数据(包括块号标记),还要考虑屏幕宽和高能不能被16整除,看了一些资料有点儿头绪但还是比较乱,如果这里解决了下面就比较容易进行了。可否再指点一下?

追答

struct buffer_block
int block_id; //存块id

char* data; //存储数据

int width;

int height;

;
height = scrinfo.yres/4

width = scrinfo.xres/4
先计算得width和height,再分配空间
data = malloc(width*height*4);
然后把framebuffer的数据复制到data中

一共复制16次,得到16个buffer_block。

要分16块的话,屏幕宽和高能被4整除就行了,不是被16整除。如果不能被4整除,那么就取最邻近的值。比如图像是 400x250,那么你可以在图像的边缘添加像素,添加成400x256像素的图像。

追问

字数有限,只能截图…… 

这个复制数据的写法对吗

追答

先要算出每一个小块的width, height

width = fb->width/4;
height = fb->height/4;
p->data 要先分配空间,然后才能memcpy,结束之后还要释放空间。
size = width*height;
p->data = (unsigned char*)malloc(size);

这段代码逻辑基本上是对了,细节上可能还要调试一下,自己上机编译实验一下吧。

参考技术A

    如果已经映射了的话,理论上应该是直接可以memcpy的,这个方法你可以尝试一下

    图像分块其实很简单,帧数据说白了就是一个很大的数组,你可以理解为二维数组

    对二维数组进行切分很简单吧。

追问

由于后面要比较两个对应块的帧数据,分块的同时要记录该块号,这时候怎么存储块号和帧数据。

这是网上找到的大概方法,可是还是不懂,Bmp若是数组的话那岂不是最多有15个数据?怎么做到根据块号比较两块的数据,知道的话可否详细说一下

追答

上面的这段代码我表示不知道是什么语言,即像c语言,但是如果按c的语法来判断完全都是些错误的代码所以不做评论,划分数据块可以通过结构体来实现例如
struct Chunk_data

int flag; //读写标志

int frame_num; //块号

char frame_data[16*16];//块大小
chunk_data;

比较两块数据,有很多种方法你可以直接调用strcmp也可以自己构建一个,但是效率如何还是要自己去尝试

追问

这个只是存储一个块的数据与块号,由于结构体不像数组那样,要存储所有块的 是不是要用链表来存储呢
struct Chunk_data

int flag; //读写标志

int frame_num; //块号

char frame_data[16*16];//块大小
Chunk_data *next;
chunk_data;

追答

用链表有链表的好处,如果熟悉链表的话,使用链表还好一点,如果不熟悉的话可以用结构体数组
其实两个本质上的区别不是很大

c语言怎么截屏并将数据转换成rgb或yuv420

C语言用什么方法截取屏幕,并将数据转换成RGB或者YUV420我要用C语言将Windows屏幕截取到,再结合FFmpegSDK将屏幕图像编码成视频文件谁能提供一些源码或思路,只要能解决问题,悬赏可以追加参考技术AC/C++code#ifndefCAPTUREBLT#defineCAPTU... 查看详情

请问怎么用c语言获取电脑(windows)的cpu,内存,硬盘利用率等信息?linux系统一样吗?

Windows系统可以搜索MSDN参考,WindowsSystemInformation这个章节下都是这一类的函数;Linux和Windows的系统调用完全不同参考技术A调用Windowsapi和硬件驱动信息 查看详情

windows下怎么用c语言读取串口里的数据?

买了个gps模块接在USB口上插在电脑上怎么用c语言把串口里的数据读出来保存到文件中参考技术AWindows下的语言读取串口的数据,可以通过USB的一些特定连接。 参考技术BWindows下的语言读取串口的数据,可以通过USB的一些特定连接... 查看详情

请问,linux下c/c++怎么获取屏幕分辨率?(不使用qt和gtk)

把这个程序运行下字符终端下到分辨率就出来了。#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<linux/fb.h>#include<sys/mman.h>#include<math.h> intw,h,bpp;int*fbmem;intmain(intargc,char*argv[]) intfd; st... 查看详情

怎么用c语言获取json中的数据?

...”:10,"bbb":20,我想使用C语言读出10和20这两个数,怎么样操作?用C语言获取JSON中的数据的方法是使用CJSON。以下简单介绍用CJSON的思路及实现:1)创建json,从json中获取数据。#nclude<stdio.h> #include"cJSON.h"char*... 查看详情

linux下c语言的crypt函数怎么用?(代码片段)

linux的crypt最近学校布置了一个网安的小作业,要用到linux里面的这个crypt函数,写一篇总结一下。首先我们要了解这个函数是用来做什么的。密码影子文件中存储了每一个用户的用户明文和其单向哈希过的秘文cipher="$1$C68vnJ27$1ttFZ... 查看详情

已知ip和端口,用c语言怎么判断能不能连接网络

已知IP和端口,用c语言怎么判断能不能连接网络,能连接网络,把数据发送给服务器。若不能连接网络,就把从客户端接收到的数据存到自己用c语言创建的文件中,等有网络后,再把缓存文件中的数据发送给服务器(JSON形式发... 查看详情

c语言下,ffmpeg怎么用?

参考技术A用system函数来调用ffmpeg 查看详情

怎么用c语言获取linux系统的网卡ip地址

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <net/if.h>#include <netdb.h>#include <arpa/inet.h>#include <sys/ioctl.h>//获取地址//返回IP地... 查看详情

linux下c语言怎么获取文件创建时间?

在Windows下,一个文件有创建时间、修改时间、访问时间。而在Linux下,一个文件也有三种时间,分别是访问时间(Access)、修改时间(Modify)、状态改变时间(Change)。可以使用stat命令查看文件的访问时间、修改时间和状态改... 查看详情

ply格式文件,用c语言怎么读入,并存储在哪种数据结构中

我要用C语言写代码,读入ply格式文件里面的数据,并把它存储到某一种数据结构中去,哪位大侠指导一下小弟啊?十分感激SSHHFF凤:你说的很有道理,可问题就是我现在对PLY格式文件的结构不懂,你知道吗?只要你理解了ply文件的结构,就... 查看详情

linux怎么运行c程序

参考技术ACC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C、C++、Ada、Fortran、Objective、Perl、Python、Ruby以及Java等,甚至Linux的许多内核和许多其他自由软件以及开放源码应用程... 查看详情

linux下c语言连接mysql

...载库文件,然后去引用进项目么?如果是这样子的,请问怎么操作。谢谢。之前看到一篇:Linux下C语言连接MySQL的帖子,要在本地机器上安装MysqlClient,这样才会有对应的Mysql库,这样c语言环境才可以连接远程库.如果非要这样的话,我... 查看详情

用c语言怎么读取word,excel和ppt文件中的数据

或者提供一些word,excel和ppt文件格式的相关资料也给分哟(用于编程)。参考技术Ac语言是dos环境下面的经典程序算是古董级别的word那些都是windows下的 查看详情

linux下intel的mkl编程代码,怎么样编译。c++和c语言代码

我安装了intel的mkl,但是知道怎么样调用命令运行程序。如果我的分别是.cpp文件和.c文件。怎么样在linux下运行。我知道c++的是g++-gXXX.cpp-XXX,那么加入mkl库函数怎么调用?还是-g吗?我用程序提供的例子都是错误的。求高手参考... 查看详情

android获取surfaceview里面的每一帧

...成图像存放在GPUBuffer中,显示设备每隔一定时间从Buffer中获取图像并显示。上述过程中的计算,对于View来说,就好比在主线程遍历View树以决定视图画多大(measure),画在哪(layout),画些啥(draw),计算结果存放在内存中,Su... 查看详情

用java语言怎么修改linux下eth0网卡的ip地址,请高手指点下,最好有例子....

使用java语言写的vi/etc/sysconfig/network-scripts/ifcfg-eth0点击i成插入状态添加IPADDR=ccc.ccc.vvv.bbb按下esc输入:wq回车结束(冒号也是要输入的)需要重启服务才能设置成刚才的ip命令为servicenetworkrestart那个我也是做java的我到现在都没听过... 查看详情

请教linux下程序怎么获取热插拔事件

参考技术A1.插上USB设备。2.用root帐号执行fdisk-l3.命令行会显示USB设备清单,如果是U盘,注意看看容量一下就看出来了。 查看详情