日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开发板屏幕截图-适用于本公司海思和智源平台 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

總結

以上是生活随笔為你收集整理的开发板屏幕截图-适用于本公司海思和智源平台的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。