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

C源码(screenshot.c):

#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 <linux/fb.h>
#include <jpeglib.h>
#include <jerror.h>
#include <errno.h>extern int errno;/*功能:		获取当前系统时间返回值:	指向时间字符串的开始位置
*/
static const char* getCurTime()					// 获取当前系统时间
{static char ret[30] = {0};time_t t;struct tm *tp;t = time(NULL);tp = localtime(&t);memset(ret, 0, sizeof(ret));sprintf(ret, "%02d%02d%02d_%02d%02d%02d", tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);return ret;
}/*功能:		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;					// 目标缓冲区是RGB格式, 每个分量占1字节, 所以用ucharunsigned short int *pix565;				// 每像素信息占2字节, 所以用short类型pix565 = (unsigned short int *)rgb565;for(i = 0; i < whole; i++){r = ((*pix565) >> 11) & 0x1f;*rgb24++ = (r << 3) | (r >> 2);g = ((*pix565) >> 5) & 0x3f;*rgb24++ = (g << 2) | (g >> 4);b = (*pix565) & 0x1f;*rgb24++ = (b << 3) | (b >> 2);pix565++;							// 源像素点后移if(rgb24[-3] == 0xFF && rgb24[-2] == 0 && rgb24[-1] == 0xFF)	// RGB = 0xFF00FFrgb24[-3] = 0;												// 修改RGB = 0x0000FF(将粉红色替换成蓝色)}return 0;
}/*功能:			将ARGB1555格式的图片数据转换成RGB24的图片数据返回值:			0argb1555:[in]	源缓冲区地址, 指向存放argb1555数据的起始地址rgb24:	[out]	目标缓冲区地址, 指向存放rgb24数据的起始地址xres:			屏幕分辨率的宽度yres:			屏幕分辨率的高度
*/
int ARGB1555_to_RGB24(unsigned char *argb1555, unsigned char *rgb24, int xres, int yres)
{int i;int whole = xres * yres;unsigned char r, g, b;unsigned short int *pix1555;pix1555 = (unsigned short int *)argb1555;for(i = 0; i < whole; i++){//	*pix1555 &= 0x7FFFFF;				// 透明分量置为0r = ((*pix1555) >> 10) & 0x1f;		// 取颜色分量: R*rgb24++ = (r << 3) | (r >> 2);g = ((*pix1555) >> 5) & 0x1f;		// 取分量: G*rgb24++ = (g << 3) | (g >> 2);b = (*pix1555) & 0x1f;				// 取分量: B*rgb24++ = (b << 3) | (b >> 2);pix1555++;if(rgb24[-3] == 0xFF && rgb24[-2] == 0 && rgb24[-1] == 0xFF)	// RGB = 0xFF00FFrgb24[-3] = 0;												// 修改RGB = 0x0000FF(将粉红色替换成蓝色)}return 0;
}/*功能:	jpeg压缩函数返回值:	0: 成功, -1: 失败rgb:	指向存放rgb24数据的起始地址width:	屏幕(分辨率)的宽度height:	屏幕(分辨率)的高度
*/
int jpeg_compress(unsigned char *rgb, int width, int height)
{char outfile[100] = {0};struct jpeg_compress_struct cinfo;struct jpeg_error_mgr jerr;FILE * pf = NULL;JSAMPROW row_pointer[1];int row_stride;sprintf(outfile, "snap_%s.jpg", getCurTime());if ((pf = fopen(outfile, "wb")) == NULL){printf("Can not create output file, please check!\n");return -1;}cinfo.err = jpeg_std_error(&jerr);jpeg_create_compress(&cinfo);jpeg_stdio_dest(&cinfo, pf);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(pf);jpeg_destroy_compress(&cinfo);			// 释放资源return 0;
}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;#ifdef PLATFORM_HISIconst char *dev = "/dev/fb0";
#elseconst char *dev = "/dev/fb1";
#endif// 打开framebuffer设备fd = open(dev, O_RDONLY);if(fd < 0){printf("fd=%d, error=[%d: %s]\n", fd, errno, strerror(errno));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;}
#ifdef PLATFORM_HISIARGB1555_to_RGB24(trgb, rgb, fb_var_info.xres, fb_var_info.yres);		// 将ARGB1555转换成RGB24格式
#elseRGB565_to_RGB24(trgb, rgb, fb_var_info.xres, fb_var_info.yres);			// 将RGB565转换成RGB24格式
#endifif(jpeg_compress(rgb, fb_var_info.xres, fb_var_info.yres) < 0)			// jpeg压缩失败printf("Jpeg compress failed!\n");read_fail:free(rgb);
here:free(trgb);close(fd);return 0;
}

makefile文件:

PLATFORM_HISI	?= Y
CFLAGS =ifeq ($(PLATFORM_HISI), Y)CC=arm-hismall-linux-gccCFLAGS += -DPLATFORM_HISI
elseCC=arm-linux-gcc
endifALL=screenshotTarget: $(ALL)screenshot: screenshot.c$(CC) -o $@ $^ $(CFLAGS) -I/opt/jpeg/include /opt/jpeg/lib/libjpeg.acp -f $@ /tftpboot/clean:rm -f *.o $(ALL)

编译脚本:

#!/bin/shif test "$1" = ""; thenmake clean
fimake PLATFORM_HISI=Y

编译海思版本:设置PLATFORM_HISI=Y

编译智源版本:设置PLATFORM_HISI=N

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

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

相关文章

听小鹏讲废话之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 上面改的是当前用户的配置噢!

Struts2学习笔记《二》

struts.xml配置文件的全部配置元素&#xff1a;       转载于:https://www.cnblogs.com/abc8023/p/4760284.html

dataset.xsd的定义(vs2008)

定义数据集就是把表拉到.xsd的界面的名称如图&#xff08;http://hi.csdn.net/attachment/201106/9/0_13076420264QqD.gif &#xff09; T_UsersTableAdapter adapter new T_UsersTableAdapter();记得添加引用类型&#xff1b;

[react] 怎样使用Hooks获取服务端数据?

[react] 怎样使用Hooks获取服务端数据&#xff1f; import React, { useState, useEffect } from react; import axios from axios; function App() {const [data, setData] useState({ hits: [] });useEffect(async () > {const result await axios(https://api/url/to/…

Linux mount挂载和umont卸载U盘

1、树莓派插入U盘没有自动挂载&#xff0c;可以在/dev/下看到盘符&#xff0c;但是打不开&#xff0c;需要挂载到指定的文件位置。 2、挂载U盘使用mount命令。 &#xff08;1&#xff09;首先查看插入设备后的文件描述符&#xff1a;找到sda1 (2)新建文件夹 (3)挂载U盘到Udis…

iOS 如果刷新TableViewCell上得数据是空的 添加尾部暂无数据提示

其实很简单 只需要给tableView底部添加一个View 然后View上添加一个Label就可以了 做个衣服判断 数组为空的话则给一个这样的View 转载于:https://www.cnblogs.com/guochaoboke/p/4761429.html

Learning Perl 2

1.子程序 1).创建子程序&#xff1a;使用关键字sub sub marine { print "Hello, world\n"; } calling subroutines&#xff0c;使用&号 &marine (2).返回值&#xff1a;所有的子程序最后一个表达式的运算结果都当作返回值。所以子程序只有“”有用返回值“和…

Ubuntu如何卸载安装的软件以FileZilla为例

1、查看已安装的软件包&#xff1a; dpkg --list 2、卸载FileZilla sudo apt-get remove filezilla

小明系列问题――小明序列(LIS)

小明系列问题――小明序列Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4521Description 大家都知道小明最喜欢研究跟序列有关的问题了&#xff0c;可是也就因为这样&#xff0c;小明几乎已经玩遍各种序列问…

【汇编语言-3】 代码、数据、堆栈在同一个段

(1) 代码段中使用数据 编程计算8个数据的和&#xff0c;结果保存在ax中。代码如下&#xff1a; code segmentassume cs:code dw 0123H,0456H,0789H,00bcH,00efh,0667h,072fh,0990H movbx,0movax,0movcx,8s:addax,cs:[bx] addbx,2loop s movax,4c00h int21hcode …

[react] 自定义组件时render是可选的吗?为什么?

[react] 自定义组件时render是可选的吗&#xff1f;为什么&#xff1f; 根据文档描述&#xff0c;class组件的render函数是必选的&#xff1a;The render() method is the only required method in a class component. 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后…

Ubuntu换源失败:Could not get lock /var/lib/apt/lists/lock - open

1、根据网上相关教程更改国内的镜像源&#xff0c;编辑了sources.list后&#xff0c;执行sudo apt-get update 出现以下报错&#xff1a; E:Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) 2、问题解析&#xff1a;内部进程正在…

微信支付(APP)集成时碰到的问题(.net提示“无权限”、iOS跳转到微信支付页面中间只有一个“确定”按钮)...

直入主题之前&#xff0c;请容我吐槽一下微*的官方东西:ASDFQ%#$%$#$%^FG#$%DSFQ#$%.......&#xff1b;吐槽玩了&#xff01;大家心照就好。 要完成手机APP跳转到微信的APP进行微信支付&#xff0c;需要进行如下操作&#xff1a; 1、先去微信的开放平台&#xff08;http://ope…

[react] 使用Hooks要遵守哪些原则?

[react] 使用Hooks要遵守哪些原则&#xff1f; 只在最顶层使用 Hook 不要在循环&#xff0c;条件或嵌套函数中调用 Hook&#xff0c; 确保总是在你的 React 函数的最顶层调用他们。只在 React 函数中调用 Hook 不要在普通的 JavaScript 函数中调用 Hook。你可以&#xff1a; ✅…

QT出现“undefined reference to `vtable for’”解决方法

Qt 中新建类时&#xff0c;若需要使用信号与槽机制&#xff0c;必须显式启用Q_OBJECT宏。利用QT IDE添加并创建新的类时&#xff0c;在编译过程中会出现以下报错&#xff1a; undefined reference to vtable for XXX类名’” 查询相关资料&#xff0c;利用IDE创建类别时&…