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

1.利用FrameBuffer设备,用ioctl()函数获取相关屏幕信息,然后用mmap()映射,用两个for循环逐个读取for(y=0;y<scrinfo.yres;y... 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下的桌面共享,求大神指点,急
展开
 我来答
yang_bigarm
2013-12-03 · TA获得超过3949个赞
知道大有可为答主
回答量:1664
采纳率:100%
帮助的人:618万
展开全部
教你一个方法,你想找某个方面的资源,就在关键词后面加详解两个字,通常都能搜到。例如搜

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像素的图像。
沣润茗茶c2
2013-12-02 · 超过23用户采纳过TA的回答
知道答主
回答量:96
采纳率:0%
帮助的人:24.9万
展开全部
  1. 如果已经映射了的话,理论上应该是直接可以memcpy的,这个方法你可以尝试一下

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

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

更多追问追答
追问

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

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

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

int frame_num; //块号

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

比较两块数据,有很多种方法你可以直接调用strcmp也可以自己构建一个,但是效率如何还是要自己去尝试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式