基于海思开发板的屏幕截图程序(一)

一直以来从事基于海思开发板的开发,但是每次想到“屏幕截图",真的让人非常惭愧!

参考网上的代码修改了下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <malloc.h>
#include <linux/fb.h>
#include <jpeglib.h>
#include <jerror.h>
#include <errno.h>extern int errno;/*RGB565转RGB24函数*@rgb565: 指向存放rgb565数据的起始地址*@rgb24:指向存放rgb24数据的起始地址*@width:屏幕(分辨率)的宽度*@height:屏幕(分辨率)的高度*/
int RGB565_to_RGB24(unsigned char *rgb565, unsigned char *rgb24, int width, int height)
{int i;int whole = width*height;unsigned char r, g, b;unsigned short int *pix565;pix565 = (unsigned short int *)rgb565;for(i = 0;i < whole;i++){r = ((*pix565)>>11)&0x1f;*rgb24 = (r<<3) | (r>>2);rgb24++;g = ((*pix565)>>5)&0x3f;*rgb24 = (g<<2) | (g>>4);rgb24++;b = (*pix565)&0x1f;*rgb24 = (b<<3) | (b>>2);rgb24++;pix565++;}return 1;
}/*jpeg压缩函数*@rgb:指向存放rgb24数据的起始地址*@width:屏幕(分辨率)的宽度*@height:屏幕(分辨率)的高度
*/
int jpeg_compress(unsigned char *rgb, int width, int height)
{struct jpeg_compress_struct cinfo;struct jpeg_error_mgr jerr;FILE * outfile;JSAMPROW row_pointer[1];int row_stride;cinfo.err = jpeg_std_error(&jerr);jpeg_create_compress(&cinfo);// 输出文件名为:out.jpgif ((outfile = fopen("out.jpg", "wb")) == NULL){printf("can not open out.jpg\n");return -1;}jpeg_stdio_dest(&cinfo, outfile);cinfo.image_width = width;cinfo.image_height = height;cinfo.input_components = 3;				// 1-灰度图,3-彩色图// 输入数据格式为RGBcinfo.in_color_space = JCS_RGB;			// JCS_GRAYSCALE-灰度图,JCS_RGB-彩色图jpeg_set_defaults(&cinfo);jpeg_set_quality(&cinfo, 80, TRUE);		// 设置压缩质量:80jpeg_start_compress(&cinfo, TRUE);		// 开始压缩过程row_stride = width * 3;					// row_stride: 每一行的字节数while (cinfo.next_scanline < cinfo.image_height){row_pointer[0] = &rgb[cinfo.next_scanline * row_stride];(void) jpeg_write_scanlines(&cinfo, row_pointer, 1);}jpeg_finish_compress(&cinfo);			// 完成压缩过程fclose(outfile);jpeg_destroy_compress(&cinfo);			// 释放资源return 1;
}int main()
{int fd;struct fb_var_screeninfo fb_var_info;struct fb_fix_screeninfo fb_fix_info;unsigned char *trgb;unsigned char *rgb;int buffer_size;const char *dev = "/dev/fb0";// 打开framebuffer设备fd = open(dev, O_RDONLY);if(fd < 0){printf("fd=%d, error=[%d: %s]\n", fd, errno, strerror(errno));printf("dev=[%s]\n", dev);perror("open");return 1;}// 获取LCD的可变参数ioctl(fd, FBIOGET_VSCREENINFO, &fb_var_info);// 一个像素多少位printf("bits_per_pixel: %d\n", fb_var_info.bits_per_pixel);printf("分辨率: %d x %d\n", fb_var_info.xres, fb_var_info.yres);printf("颜色分量值: (A, R, G, B) = (%d, %d, %d, %d)bits\n", fb_var_info.transp.length, fb_var_info.red.length, fb_var_info.green.length, fb_var_info.blue.length);printf("颜色分量偏移: (A, R, G, B) = (%d, %d, %d, %d)\n", fb_var_info.transp.offset, fb_var_info.red.offset, fb_var_info.green.offset, fb_var_info.blue.offset);// 获取LCD的固定参数ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix_info);// 一帧大小printf("smem_len: %#X\n", fb_fix_info.smem_len);// 一行大小printf("line_length: %#X\n", fb_fix_info.line_length);// 一帧大小buffer_size = (fb_var_info.xres * fb_var_info.yres * fb_var_info.bits_per_pixel / 8);trgb = (unsigned char *)malloc(buffer_size);if(trgb == NULL)exit(0);rgb = (unsigned char *)malloc(fb_var_info.xres * fb_var_info.yres * 3);if(rgb == NULL){goto here;}if(read(fd, trgb, buffer_size) < 0)		// 获取一帧数据{printf("read failed!\n");goto read_fail;}// 格式转换RGB565_to_RGB24(trgb, rgb, fb_var_info.xres, fb_var_info.yres);// jpeg压缩if(jpeg_compress(rgb, fb_var_info.xres, fb_var_info.yres) < 0)printf("compress failed!\n");read_fail:free(rgb);
here:free(trgb);close(fd);return 0;
}

最初编译时遇到的最大问题就是:jpeg库是PC上的,而不是适用于嵌入式下的。所以编译之前的第一步工作就是: 下载并安装jpeg库

我下载的链接是:http://www.ijg.org/files/jpegsrc.v9.tar.gz

解压到/mnt/other/jpeg-9目录下,再执行以下shell命令:

export CC=arm-hismall-linux-gcc
./configure --host=arm-unknow-linux --prefix=/opt/jpeg --enable-shared --enable-static

接下来进行安装:

make
make install

这样,就安装完成了。为了编译我的程序,我写了个简单的makefile文件:

CC=arm-hismall-linux-gcc
ALL=aTarget: $(ALL)a: a.c$(CC) -o $@ $^ -I/opt/jpeg/include /opt/jpeg/lib/libjpeg.acp $@ /tftpboot/DVR/aclean:rm -f *.o $(ALL)

接着就是编译程序了:make

OK, 程序编译完成,在当前目录下生成可执行文件a,不过这个文件只能在开发板上运行噢!


在开发板上挂载/tftpboot/DVR目录,将里面的a拷贝到开发板上可读写的目录下,接着就可以执行a程序了,执行完成后,会在a所在的目录下生成out.jpg图片,这个就是屏幕截图的结果了!将它移到PC上,就可以通过普通的图片浏览工具来预览了!


但是,最终生成的图片还是有点让人失望--存在明显的失真,等有空再研究估计是函数RGB565_to_RGB24()的问题,抽空再改进下!

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

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

相关文章

[react] 如何给非控组件设置默认的值?

[react] 如何给非控组件设置默认的值&#xff1f; 表单元素依赖于状态(state)&#xff0c;表单元素需要默认值实时映射到状态的时候&#xff0c;就是受控组件 <input name"username" type"text" value{this.state.username} onChange{this.handleChan…

Linux 多线程开发-线程的属性-分离detached和连接joinable

1、描述 linux的POSIX线程分离状态决定一个线程以什么方式来终止。默认的分离状态是可连接态&#xff08;joinable&#xff09;&#xff0c;创建线程是参数设置为NULL&#xff0c;就是默认连接态&#xff0c;可以被pthread_join。 Linux的POSIX线程要么分离要么连接分别用一下…

oracle10g随服务器启动而自动启动(linux as 5)

http://blog.sina.com.cn/s/blog_5007d1b10100lq7g.html

[BBS]搭建开源论坛之Jforum搭配开源CKEDITOR

本文作者&#xff1a;sushengmiyan本文地址&#xff1a;http://blog.csdn.net/sushengmiyan/article/details/47946065使用默认的编辑器的时候&#xff0c;格式都无法保存。现在按照上节的方法更改了编辑器。今天再对编辑器进行更改&#xff0c;适应jforum.效果如下图了。记录几…

Linux cJSON库的使用、编译为cJSON动态库

参考 &#xff1a; https://blog.csdn.net/nanfeibuyi/article/details/86605314

[react] 怎么在React中引入其它的UI库,例如Bootstrap

[react] 怎么在React中引入其它的UI库&#xff0c;例如Bootstrap react-bootstrap是一个非常受欢迎的针对react封装过的bootstrap&#xff0c;它本身不包含css&#xff0c;所以也是需要使用bootstrap原生库。 在create-react-app建的项目目录中安装react-bootstrap。 npm inst…

基于海思开发板的屏幕截图程序(二)

针对 基于海思开发板的屏幕截图程序(一)作了改进&#xff0c;上篇文章的截图结果不正确的原因是&#xff1a;我公司的开发板上fb0中设置的图片格式为ARGB1555&#xff0c;但是我将它作为RGB565来使用&#xff0c;导致转换出来的图片数据不正确&#xff0c;所以压缩后的图片自然…

Linux 多线程开发-线程的结束pthread_kill和pthread_cancel

1、线程结束的方式 &#xff08;1&#xff09;线程函数中调用pthread_exit函数&#xff0c;不会导致对象析构&#xff0c;可以使用&#xff08;2&#xff09;线程所属的进程结束&#xff0c;进程调用exit&#xff0c;线程C对象不会销毁&#xff0c;不安全&#xff0c;属于被动…

Windows7休眠状态下载技巧攻略

Windows7休眠状态下载技巧攻略 你想让你的快车或者是迅雷通宵下载电影&#xff0c;而且还能省电么?或许你会说&#xff0c;我不关机&#xff0c;给迅雷和快车添加完下载任务&#xff0c;挂在那里不就可以了吗?这没错&#xff0c;开着电脑通宵下载是可以&#xff0c;但这样的方…

支付模块设计

1.背景知识 ssl:SSL为安全套接层&#xff0c;SSL 安全协议最初是由美国网景 Netscape Communication 公司设计开发的&#xff0c;全称为&#xff1a;安全套接层协议 (Secure Sockets Layer) &#xff0c; 它指定了在应用程序协议 ( 如 HTTP 、 Telnet 、 FTP) 和 TCP/IP 之间提…

NB-IOT/Lora/Zigbee/WIFI/蓝牙无线组网方式的对比

NB-IOT/Lora/Zigbee/WIFI/蓝牙无线组网方式的对比 LoRa LoRa(长 距离)是由Semtech公司开发的一种技术&#xff0c;典型工作频率在美国是915MHz&#xff0c;在欧洲是868MHz&#xff0c;在亚洲是433MHz。LoRa的物理层 (PHY)使用了一种独特形式的带前向纠错(FEC)的调频啁啾扩频技…

[react] React必须使用JSX吗?

[react] React必须使用JSX吗&#xff1f; 首先给出答案&#xff0c;不是必须的 只不过通过JSX&#xff0c;你可以简单明了的知道UI是怎样的 JSX is a syntax extension to JavaScript. We recommend using it with React to describe what the UI should look like 个人简介 …

Qt 设置textEdit插入文本的字体、大小和颜色

1:、打开字体对话框选择字体 //用到头文件&#xff1a;#include <QFontDialog> void MainWindow::on_pushButton_font_clicked() {bool ok;QFont f QFontDialog::getFont(&ok, QFont("Consolas",9), this,"设置显示字体");if(ok){font f;} } …

开发板屏幕截图-适用于本公司海思和智源平台

C源码(screenshot.c)&#xff1a; #include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <unistd.h> #include <time.h> #include <string.h> #include <fcntl.h> #include <malloc.h> #include <linu…

听小鹏讲废话之OSI

大家好&#xff0c;在下小鹏&#xff0c;大学刚毕业1年&#xff0c;目前从事华为网络设备工作。写这篇文章&#xff0c;有两个目的&#xff0c;第一&#xff0c;和大家分享学习的乐趣&#xff0c;俗话说&#xff0c;没有学不会的学生&#xff0c;只有教不会的老师&#xff1b;第…

python spark 配置

前提&#xff1a;已经装好 java 1.8 和 hadoop 2.7 1. 下载解压放后的目录 /Users/gao/spark-1.4.1-bin-hadoop2.6 2. 在~/.bash_profile 中加入 export PYTHONPATH$PYTHONPATH:/Users/gao/spark-1.4.1-bin-hadoop2.6/python 3. 将/Users/gao/spark-1.4.1-bin-hadoop2.6/python…

Linux du查看磁盘文件夹占用容量

1、du 查看当前文件夹的占用容量&#xff1a; du -sh eg. 查看/usr的占用 2、指定层级查看 查看当前目录下最多一级目录的容量 du -h --max-depth1

Linux下串口参数VTIME和VMIN的用法

VTIME指定了等待的时间,VMIN指定了读取字符的最小数量。 它们不同组合地取值会得到不同的结果&#xff0c;分别如下&#xff1a; 1&#xff0e;当VTIME>0&#xff0c;VMIN>0时。read调用将保持阻塞直到读取到第一个字符&#xff0c;读到了第一个字符之后开始计时&#xf…

[react] 在React中怎么将参数传递给事件?

[react] 在React中怎么将参数传递给事件&#xff1f; 如果使用箭头函数声明函数&#xff0c;调用方式&#xff1a; 不传参&#xff1a;this.func1&#xff0c;如果不传参&#xff0c;事件参数默认会自己添加上 传参&#xff1a; (e) > {this.func1(e,param1, param2)}&…

修改系统默认路径,如收藏夹、桌面、我的文档

修改系统默认路径&#xff0c;如收藏夹、桌面、我的文档。。。。 修改分支为&#xff1a;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders 上面改的是当前用户的配置噢!