QNX 7.0 Screen截图示例程序

 该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 720

QNXWindow::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 pixmap
    int 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 to
    screen_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 screenshot
    screen_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");
}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QNX 7.0中,开启QNX Trusted Disk需要进行以下配置: 1. 配置策略文件。可以使用tcsadmin工具创建和修改策略文件。策略文件包括定义哪些进程可以访问Trusted Disk,以及哪些操作需要进行身份验证等配置。在QNX 7.0中,策略文件存储在“/etc/tcs”目录下。 2. 加载TPM驱动程序和TPM2软件栈。在QNX 7.0中,TPM驱动程序和TPM2软件栈已经预先安装在系统中,不需要再手动加载。 3. 生成密钥并将其存储在TPM中。可以使用tpmtool工具来生成和管理密钥。在QNX 7.0中,tpmtool工具已经预先安装在系统中。 4. 创建和格式化Trusted Disk。可以使用mktrd工具来创建和格式化Trusted Disk。在QNX 7.0中,mktrd工具已经预先安装在系统中。 5. 将Trusted Disk挂载到文件系统中。可以使用mount工具将Trusted Disk挂载到文件系统中。 具体的配置步骤如下: 1. 使用tcsadmin工具创建策略文件。打开QNX Momentics控制台,进入命令行界面,使用以下命令创建名为“my_policy”的策略文件: ``` tcsadmin -p my_policy -n "My Policy" ``` 然后,使用以下命令将策略文件的访问控制设置为允许所有进程访问: ``` tcsadmin -p my_policy -a allow -t process ``` 2. 生成密钥并将其存储在TPM中。使用以下命令生成一个名为“my_key”的密钥: ``` tpmtool createkey -o my_key ``` 然后,将密钥存储在TPM中: ``` tpmtool storekey -u my_key ``` 3. 创建和格式化Trusted Disk。使用以下命令创建名为“my_trd”的Trusted Disk: ``` mktrd -t crypto -s 1M -p my_policy -k my_key my_trd ``` 然后,使用以下命令格式化Trusted Disk: ``` fdisk -c -t crypto my_trd ``` 4. 将Trusted Disk挂载到文件系统中。使用以下命令将Trusted Disk挂载到名为“/trd”目录: ``` mount -T io-blk crypto my_trd /trd ``` 完成上述步骤后,您就可以在QNX 7.0操作系统中使用QNX Trusted Disk了。请注意,这里的示例仅供参考,具体的操作步骤可能会因您使用的QNX版本和硬件而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龋龋独行的菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值