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

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

  1. Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121314575 长期持续项目技术分享,Shang业Di ...

  2. 海思开发板海图科技测评,海图海思开发板怎么样

    关于海思开发板海图科技的测评,相关关键字:hi3516,hi3519,hi3531,hi3535,hi3536,hi3559,hi3403 最近网络上关于海图的海思开发板宣传的沸沸扬扬,很多人都想要一 ...

  3. ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)

    本文利用6818开发板完成LCD屏上绘制任意的矩形,圆形,三角形或五角星形图案,还有绘制太极,五星红旗的方案. 目录 映射 绘制矩形 代码思路 代码实现 实践出真知 绘制圆形 代码思路 代码实现 绘制 ...

  4. 关于麒麟座开发板串口打印乱码与其它工程用官方源码出问题的解决方案

    我用的是迷你板,感觉板子小巧精致甚是受大家喜爱.我们抱有学习目的同志们当然不能止步于只看官方的源码,只用官方的工程.那么自己建立工程学习的过程中一般你们会遇到程序在其它板子上跑的没问题,但下载到迷你板 ...

  5. 1.海思项目整理 编译烧录+启动参数+sample编译+bayeRGBYUV+MPP(VB+VI+VPSS)

    1.1.2.检测开发板 (4)SecureCRT监视打开,开发板开机,自动挂载到/home/aston/rootfs中 (5)自动加入/mnt中,执行./sample_venc即可 (6)在vlc中输 ...

  6. 海思芯片部署MPP并验证功能

    1. 前期准备 1.1搭建好开发环境: 1.这里说的是以个人电脑进行开发:安装好虚拟机,在虚拟机中搭建好nfs服务器,确保开发板可以挂载上虚拟机: 2.确保开发板和PC可以通过串口通信: 1.2熟悉海 ...

  7. 海思 DSP xtensa xplorer

    海思新出的HI3559A和Hi3519A自带了DSP,对于我们这种做图形图像处理及加速的太有用了.拿到开发板后,才发现海思只提供了一个膨胀和腐蚀的例子.更坑的是,居然没有源代码,关键算法被封装成库了. ...

  8. 海思Hi3516EV300开发板防雷防静电图

    一.应用场合: 适用于开发以下产品: (1)200万/300万网络摄像机. (2)4G/WIFI无线传输产品. (3)安防监控产品. (4)网络音视频产品. (5)编码器. (6)双路摄像机. (8) ...

  9. 华为海思MPP媒体处理软件开发学习(基础)

    1.系统概述 1.1概述 海思提供的媒体处理软件平台(Media Process Platform,简称 MPP),可支持应用软件快速 开发.该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软 ...

最新文章

  1. java hanoi_Hanoi问题java解法
  2. 如何在FineUIMvc(ASP.NET MVC)视图中绑定多个模型?
  3. CSV XLS文件区别
  4. “AI李佳琦”:“哦买尬,买它!”,清北中科院CMU争相角逐
  5. Oracle中的rownum和rowid
  6. openlayers地图旋转_地图切换动画#openlayers入门笔记#
  7. 飞鸽传书谈哈希表之数学原理
  8. php命名空间更麻烦了,紧急求教PHP命名空间问题,12:10了我还没有吃饭呢,各位帮忙!!...
  9. 【光学】基于matlab GUI(杨氏双缝+劈尖)干涉+(单缝+多缝+圆孔+矩孔)衍射仿真【含Matlab源码 878期】
  10. 关于西门子STEP7 在Windows10安装的一些心得
  11. Linux下修改键盘映射
  12. TeamViewer远程访问打开软件黑屏
  13. matlab特征值分解
  14. P02014080杨臣----周五信息论课程回答作业
  15. sumo交通流仿真软件的使用说明
  16. Windows远程桌面无法最大化问题
  17. 位移传递率matlab编程,机械振动设计计算与VB编程实例
  18. [算法]声音数据处理
  19. RationalDMIS 7.1 程序示例
  20. pycharm中同一目录下py文件不能相互调用

热门文章

  1. [MSSQL]COALESCE与ISNULL函数
  2. [转]ODAC 应用技巧 (一)使用 ODAC 的 Net 方式
  3. 为什么防火墙透传不过去VLAN11?
  4. System.Data.SQLite(SQLite ADO.NET 2.0的提供程序,已经包含Sqlite引擎)
  5. covid 19如何重塑美国科技公司的工作文化
  6. leetcode 81. 搜索旋转排序数组 II(二分查找)
  7. leetcode 74. 搜索二维矩阵(二分)
  8. ruby nil_Ruby中的数据类型-True,False和Nil用示例解释
  9. 摆脱加卡他卡_如何通过三个简单的步骤摆脱“故事卡地狱”。
  10. TCP/IP协议-1