文件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相关的知识到这里就差不多了,如果有哪里写错了请指正,大家互相学习。

原文地址:https://www.cnblogs.com/smallqizhang/p/12381175.html