zoukankan      html  css  js  c++  java
  • 文件IO其四 图片显示

    1.设备的使用

      屏幕显示的原理:显示设备一帧的显示是从左上角的第一个像素开始的,依次一行一行的显示,知道右下角的最后一个像素为止。

       我们需要关注的参数:

      a.像素分别率  一行有多少个像素,一列有多少个像素

      b.像素位数  

            黑白  8位2进制位

            彩色    R  G  B  A(灰度值)

              16位       5  6  5

              24位  8  8  8

              32位  8  8  8  8

      控制设备的显示内容实际上就是往显存上写入对应的数据,操作做显示设备就简化成了操作显存(即操作内存)。

      

     2.我所使用的开发板对应的显示设备文件是  /dev/fb0,属于帧缓冲设备(不同的设备可能在其他目录),访问设备文件使用文件IO的系统调用。

      操作步骤:(1)打开设备文件  open

           (2)映射显存到用户空间  mmap函数

           参数:  addr  映射的目标地址(通常情况下给NULL,让系统选择映射地址)

                length  营社区长度(按页映射,一页4096字节)

                port  映射区权限

    PORT_EXEC 可执行页面
    PORT_READ 可读页
    PORT_WRITE 可写页
    PORT_NONE 无法访问页

            flags  映射标志

    MAP_SHARED 共享式映射(对营社区的操作会同步到文件)
    MAP_PRIVATE 私有式映射(对映射区的操作不会同步到文件)
    MAP_ANONYMOUS 不映射文件,而是映射物理内存

              fd  映射文件的文件描述符

              offset  映射文件的偏移

            函数执行成功后悔返回映射目标的地址,失败则返回MAP_FAILED

          (3)操作映射的显存

          (4)解除映射  munmap函数

          (5)关闭设备文件  close

         获取linux系统中帧缓冲设备的参数  ioctl

        

           参数:fd  文件描述符

             request  命令,对应要进行的操作

             ...  不停参数

           在帧缓冲设备中可以时使用ioctl,(fd,FBIOGET_VSCREENINFO,&var);var的类型如下:

    239 struct fb_var_screeninfo {
    240         __u32 xres;                     /* 行像素个数*/
    241         __u32 yres;                    //列像素个数
    242         __u32 xres_virtual;             /* virtual resolution           */
    243         __u32 yres_virtual;
    244         __u32 xoffset;                  /* offset from virtual to visible */
    245         __u32 yoffset;                  /* resolution                   */
    246 
    247         __u32 bits_per_pixel;           /* 像素位数*/
    248         __u32 grayscale;                /* 0 = color, 1 = grayscale,    */
    249                                         /* >1 = FOURCC                  */
    250         struct fb_bitfield red;         /* bitfield in fb mem if true color, */
    251         struct fb_bitfield green;       /* else only length is significant */
    252         struct fb_bitfield blue;
    253         struct fb_bitfield transp;      /* transparency                 */
    254 
    255         __u32 nonstd;                   /* != 0 Non standard pixel format */
    256 
    257         __u32 activate;                 /* see FB_ACTIVATE_*            */
    258 
    259         __u32 height;                   /* height of picture in mm    */
    260         __u32 width;                    /* width of picture in mm     */
    261 
    262         __u32 accel_flags;              /* (OBSOLETE) see fb_info.flags */
    263 
    264         /* Timing: All values in pixclocks, except pixclock (of course) */
    265         __u32 pixclock;                 /* pixel clock in ps (pico seconds) */
    266         __u32 left_margin;              /* time from sync to picture    */
    267         __u32 right_margin;             /* time from picture to sync    */
    268         __u32 upper_margin;             /* time from sync to picture    */
    269         __u32 lower_margin;
    270         __u32 hsync_len;                /* length of horizontal sync    */
    271         __u32 vsync_len;                /* length of vertical sync      */
    272         __u32 sync;                     /* see FB_SYNC_*                */
    273         __u32 vmode;                    /* see FB_VMODE_*               */
    274         __u32 rotate;                   /* angle we rotate counter clockwise */
    275         __u32 colorspace;               /* colorspace for FOURCC-based modes */
    276         __u32 reserved[4];              /* Reserved for future compatibility */
    277 };

    3.开发板上的图片显示

      a.图片格式:

        位图(广义)  以像素数据来记录图片,颜色还原度高,缩放会失真。

        矢量图  记录图像线条来记录数据,缩放不失真。

      b.位图(广义)格式  bmp、jpeg、png、tiff、gif

      c.bmp图片格式

        bmp图片由一下四部分构成:

     

       文件头:

       信息头:

       图像数据的RGB顺序:

        24位RGB按照BRG的顺序来存储每个像素的各颜色通道的值,一个像素的所有颜色分量值都存完之后才存下一个像素,不进行交织存储。

    4.图片的缩放

      

         假设要显示的大小为:x,y

        实际图片的大小为:x0,y0

        那么图片显示的坐标i,j对应图片坐标x0,y0的关系为:

          i0 = i*y0 / y;j0 = j* x0/x;

    5.触摸屏

      触摸屏的作用就是获取用户触摸的坐标,以实现的原理来分可以分为电容屏和电阻屏,在linux系统中,输入设备的驱动通常使用输入(input)子系统框架来实现。

        a.输入子系统的特点

          对应的设备文件  /dev/event0...1...  /dev/inut/event0...1...

          我所使用的开发板触摸屏对应上的设备文件是  /dev/input/event0

          以下是输入时间input的结构体  struct input_event

    struct input_event {
     27 #if (__BITS_PER_LONG != 32 || !defined(__USE_TIME_BITS64)) && !defined(__KERNEL__)
     28         struct timeval time;//时间戳
     29 #define input_event_sec time.tv_sec
     30 #define input_event_usec time.tv_usec
     31 #else
     32         __kernel_ulong_t __sec;
     33 #if defined(__sparc__) && defined(__arch64__)
     34         unsigned int __usec;
     35 #else
     36         __kernel_ulong_t __usec;
     37 #endif
     38 #define input_event_sec  __sec
     39 #define input_event_usec __usec
     40 #endif
     41         __u16 type;//事件类型
     42         __u16 code;//键值(按键事件) 坐标类型(坐标事件)
     43         __s32 value;//按键状态(按键事件)  坐标值(坐标事件)
     44 };
    
     
    
    //事件类型
     38 #define EV_SYN                  0x00  //同步事件
     39 #define EV_KEY                  0x01  //按键事件
     40 #define EV_REL                  0x02  //相对坐标事件
     41 #define EV_ABS                  0x03  //绝对坐标事件
    
     
    
    //键值
    
     75 #define KEY_RESERVED            0
     76 #define KEY_ESC                 1
     77 #define KEY_1                   2
     78 #define KEY_2                   3
     79 #define KEY_3                   4
    
    411 #define BTN_TOUCH               0x14a //按键触摸
    
     
    
    //坐标类型
    
    728 #define ABS_X                   0x00 //X坐标
    729 #define ABS_Y                   0x01 //Y坐标
    730 #define ABS_Z                   0x02

    我所学到的文件IO相关的知识到这里就差不多了,如果有哪里写错了请指正,大家互相学习。

  • 相关阅读:
    RAID介绍,RAID5,10制作与损坏恢复
    ELK 安装过程
    centos 系统 yum安装软件报错
    linux系统磁盘分区
    python实现遍历两个文件夹,比对文件异常,生成比对报告功能
    win10新装系统,显卡风扇转动,链接正常开机,但设备管理器如果显示,无法更新驱动
    navicat premium 破解,无限试用方法
    安装vmware workstations 12 +ubuntu 遇到的一些问题
    win10 如何打开telnet,ftp等服务
    linux集群架构-keepalived高可用
  • 原文地址:https://www.cnblogs.com/smallqizhang/p/12381175.html
Copyright © 2011-2022 走看看