该Demo给予QNX Screen官方开发教程(地址:http://www.qnx.com/developers/docs/7.0.0/index.html#com.qnx.doc.screen/topic/manual/cscreen_about.html),结合bmp图片数据格式,整理的一个Screen学习入门程序。

1.头文件信息

#ifndef _QNXWINDOW_H_
#define _QNXWINDOW_H_#include<screen/screen.h>#pragma pack(push, 2)//强制两字节对齐typedef struct bitmap_info_header{uint32_t   biSize;           /* Size of info header */uint32_t   biWidth;          /* Width of image */uint32_t   biHeight;         /* Height of image */uint16_t   biPlanes;         /* Number of color planes */uint16_t   biBitCount;       /* Number of bits per pixel */uint32_t   biCompression;    /* Type of compression to use */uint32_t   biSizeImage;      /* Size of image data */uint32_t   biXPelsPerMeter;  /* X pixels per meter */uint32_t   biYPelsPerMeter;  /* Y pixels per meter */uint32_t   biClrUsed;        /* Number of colors used */uint32_t   biClrImportant;   /* Number of important colors */}bitmap_info_header_t;typedef struct bitmap_header{uint16_t   bfType;            /*bmp=0x4D42*/  uint32_t   bfSize;           /* Size of file */uint16_t   bfReserved1;      /* Reserved */uint16_t   bfReserved2;      /* ... */uint32_t   bfOffBits;        /* Offset to bitmap data */bitmap_info_header_t bitmap_info;} bitmap_header_t;class QNXWindow
{
private:/* data */
public:QNXWindow();~QNXWindow();void create_screenshot_bmp();};#endif

2.源文件信息

#include"qnxwindow.h"
#include<iostream>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<thread>#define DISPLAY_SCREEN 0
#define DISPLAY_WIDTH 1920
#define DISPLAY_HEIGHT 720QNXWindow::QNXWindow()
{create_screenshot_bmp();
}QNXWindow::~QNXWindow()
{}void QNXWindow::create_screenshot_bmp()
{screen_context_t screen_bmp_ctx;screen_create_context(&screen_bmp_ctx, SCREEN_DISPLAY_MANAGER_CONTEXT);//获取显示屏幕的数量int count = 0;screen_get_context_property_iv(screen_bmp_ctx, SCREEN_PROPERTY_DISPLAY_COUNT, &count);screen_display_t *screen_displays = (screen_display_t*)calloc(count, sizeof(screen_display_t));screen_get_context_property_pv(screen_bmp_ctx, SCREEN_PROPERTY_DISPLAYS, (void**)screen_displays);for(int i = 0; i < count; ++i){//读取屏幕信息int display_id;int size[2];screen_get_display_property_iv(screen_displays[i], SCREEN_PROPERTY_ID, &display_id);screen_get_display_property_iv(screen_displays[i], SCREEN_PROPERTY_SIZE, size);printf("screen_pixmap = %d, width = %d, height = %d\n", display_id, size[0], size[1]);}screen_pixmap_t screen_pixmap = nullptr;screen_buffer_t screen_pixmap_buf = nullptr;char *screen_pixmap_ptr = nullptr;int screen_pixmap_stride = 0;int rect[4] = { 0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT};screen_create_pixmap(&screen_pixmap, screen_bmp_ctx);int usage = SCREEN_USAGE_READ | SCREEN_USAGE_NATIVE ;screen_set_pixmap_property_iv(screen_pixmap, SCREEN_PROPERTY_USAGE, &usage);int format = SCREEN_FORMAT_RGBA8888;screen_set_pixmap_property_iv(screen_pixmap, SCREEN_PROPERTY_FORMAT, &format);//set the buffer size of the pixmapint size[2] = {DISPLAY_WIDTH, DISPLAY_HEIGHT};screen_set_pixmap_property_iv(screen_pixmap, SCREEN_PROPERTY_BUFFER_SIZE, size);//create the pixmap buffer//the buffer where the pixels from the source window will be copied toscreen_create_pixmap_buffer(screen_pixmap);screen_get_pixmap_property_pv(screen_pixmap, SCREEN_PROPERTY_RENDER_BUFFERS, (void**)&screen_pixmap_buf);screen_get_buffer_property_pv(screen_pixmap_buf, SCREEN_PROPERTY_POINTER, (void**)&screen_pixmap_ptr);screen_get_buffer_property_iv(screen_pixmap_buf, SCREEN_PROPERTY_STRIDE, &screen_pixmap_stride);//take the window screenshotscreen_read_display(screen_displays[DISPLAY_SCREEN], screen_pixmap_buf, 0, NULL, 0);if(screen_displays == nullptr){printf("get disp failed!\n");return;}int length = sizeof(bitmap_header_t);bitmap_header_t bitmap_head;bitmap_head.bfType = 0x4D42;//文件类型bitmap_head.bfSize = DISPLAY_WIDTH * DISPLAY_HEIGHT * 4;//文件数据长度   bitmap_head.bfReserved1 = 0;bitmap_head.bfReserved2 = 0;bitmap_head.bfOffBits = 0x36;bitmap_head.bitmap_info.biSize = sizeof(bitmap_info_header_t);//图像数据头大小bitmap_head.bitmap_info.biWidth = DISPLAY_WIDTH;bitmap_head.bitmap_info.biHeight = DISPLAY_HEIGHT;bitmap_head.bitmap_info.biPlanes = 1;bitmap_head.bitmap_info.biBitCount = 32;bitmap_head.bitmap_info.biCompression = 0;bitmap_head.bitmap_info.biSizeImage = 0;bitmap_head.bitmap_info.biXPelsPerMeter = 5000;bitmap_head.bitmap_info.biYPelsPerMeter = 5000;bitmap_head.bitmap_info.biClrUsed = 0;bitmap_head.bitmap_info.biClrImportant = 0;int nbytes = size[0] * size[1] * 4;std::string fname = "/screenpixmap.bmp";int fd = creat(fname.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); write(fd, &bitmap_head, length);printf("size = %d\n", length);printf("screen_pixmap_ptr = %p\n", screen_pixmap_ptr);printf("screen_pixmap_stride = %d\n", screen_pixmap_stride);/*bmp显示顺序与写入顺序相反*/for(int i = size[1] - 1; i >= 0; i--){write(fd, screen_pixmap_ptr + i * screen_pixmap_stride, size[0] * 4);}close(fd);printf("finished!\n");
}

QNX 7.0 Screen截图示例程序相关推荐

  1. DotNetBar for Windows Forms 12.2.0.7_冰河之刃重打包版原创发布-带官方示例程序版

    关于 DotNetBar for Windows Forms 12.2.0.7_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  2. [转]微软代码示例:ASP.NET 2.0 三层架构应用程序教程系列

    本文转自:http://www.codeusing.com/hi/uephee.wen/resource/view/170.aspx 资源分类:微软代码示例               更新日期:20 ...

  3. 【STC15】定时器2模式0作为波特率发生器示例程序

    [STC15]定时器2模式0作为波特率发生器示例程序 在此期间使用自制的STC开发板STC15W408AS和STC15F2K60S2分别测试了定时器2和定时器1作为波特率发生器,STC15F2K60S ...

  4. DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版原创发布-带官方示例程序版

    关于 DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版------------- ...

  5. DotNetBar for Windows Forms 12.5.0.2_冰河之刃重打包版原创发布-带官方示例程序版

    关于 DotNetBar for Windows Forms 12.5.0.2_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  6. python画棒棒糖程序_coloradd模块0.25版示例代码棒棒糖_colorset_saturationset_lightset

    coloradd模块主要用来配合海龟画图,能使所画的图形更加漂亮. 本源代码为coloradd模块学习代码,请认真查看saturationset和lightset和coloradd与colorset的 ...

  7. F:大疆M300PSDKv2.1.0通过树莓派4B向pilot传输图片与视频。(只运行示例程序)

    想要向pilot传输数据,纯粹的只为了运行示例程序,打通通道.那么对示例程序不需要进行任何添加,只需要添加info中的app信息. 然后按照下面的图连接 然后直接运行示例程序project目录下的程序 ...

  8. screen 命令示例:管理多个终端会话

    GNU Screen 是一个终端多路复用器(窗口管理器).顾名思义,Screen 可以在多个交互式 shell 之间复用物理终端,因此我们可以在每个终端会话中执行不同的任务.所有的 Screen 会话 ...

  9. [spm操作] 什么是ROI,如何做ROI以及批量提取ROI的%signal change的示例程序

    本帖作为 <用Matlab和SPM批量处理被试的经验总结> 的一部分 目录贴请见 http://home.52brain.com/forum.ph ... =1&extra=#pi ...

最新文章

  1. 使用Struts2标签遍历集合
  2. ubuntu server 改变系统语言支持中文
  3. Ubuntu下安装realtek的rtl8188eu网卡芯片驱动
  4. linux video属性_linux查询video设备类型
  5. ITK:按标量乘以图像
  6. android 查找字符在字符串的位置
  7. rxjava 并行_使用RxJava和Completable并行执行阻塞任务
  8. 医保费用监控指标体系建立(九)其他专项分析
  9. 【ES】学习5-全文搜索
  10. 枚举值是什么意思_期权的Theta值是什么意思?有什么意义?
  11. tp5写的系统比php源码写的慢多少,基于TP5框架开发的极速企业网站开发框架PHP源码...
  12. 给angularJs grid列上添加自定义按钮
  13. JSTL标签使用说明
  14. MySQL 基础--时间戳类型
  15. 简单介绍在线OTA几款平台
  16. libcurl - curl_easy_getinfo - 从 curl 句柄中提取信息 - 可用信息
  17. 临床数据的区组实验数据分析 - 倾向性评分匹配 (PSM)
  18. 线代引论:独立性,基底,维度
  19. 24、Java——银行存款取款系统(对象+集合)
  20. HTML中table表格的常用标签及属性

热门文章

  1. 开源阅读书源_手机阅读app,只推荐这几款,杂志,漫画英文小说,都可以免费轻松阅读...
  2. 5分钟学会Pyecharts数据可视化
  3. 【大话Mysql面试】-SQL语句优化
  4. cad面积累计lisp怎么用_使用AutoLISP获取或设置AutoCAD全局比例因子 | 坐倚北风
  5. 低电压版cpu java编程_cpu低电压版跟标准电压版区别哪个好
  6. 【Java】多个pdf合并成一个pdf(Itext)
  7. 国服CSGO加载Steam创意工坊的图
  8. Flatlist alwaysBounceVertical
  9. 如何将横向滚动条加粗css,css实现横向滚动条的两种方式(代码实例)
  10. 那些炫酷的词云图是怎么做出来的?