zoukankan      html  css  js  c++  java
  • 利用framebuffer,命令行显示图片

    上代码

    import fcntl
    import struct
    import mmap
    import contextlib
    import os
    import time
    import numpy as np
    import cv2
    
    
    src = cv2.imread('./1.bmp', cv2.IMREAD_COLOR)
    img = src#[0:100, 0:400]
    print img.shape
    
    
    
    with open('/dev/fb0', 'r+b') as fbfd:    
        fb_fix_screeninfo = struct.pack('16sLIIIIIIIILIIHHH',
                                        '0000000000000000',
                                        0L, 0,0,0,0,0,0,0,0, 
                                        0L, 0, 0, 0, 0, 0)
        '''
        struct fb_fix_screeninfo {
                char id[16];            /* identification string eg "TT Builtin" */
                unsigned long smem_start;    /* Start of frame buffer mem */
                                                /* (physical address) */
                __u32 smem_len;            /* Length of frame buffer mem */
                __u32 type;            /* see FB_TYPE_*        */
                __u32 type_aux;            /* Interleave for interleaved Planes */
                __u32 visual;            /* see FB_VISUAL_*        */ 
                __u16 xpanstep;            /* zero if no hardware panning  */
                __u16 ypanstep;            /* zero if no hardware panning  */
                __u16 ywrapstep;        /* zero if no hardware ywrap    */
                __u32 line_length;        /* length of a line in bytes    */
                unsigned long mmio_start;    /* Start of Memory Mapped I/O   */
                                                /* (physical address) */
                __u32 mmio_len;            /* Length of Memory Mapped I/O  */
                __u32 accel;            /* Indicate to driver which    */
                                                /*  specific chip/card we have    */
                __u16 capabilities;        /* see FB_CAP_*            */
                __u16 reserved[2];        /* Reserved for future compatibility */
        };
        '''
        fb_fix_screeninfo = fcntl.ioctl(fbfd, 0x4602, fb_fix_screeninfo)
        fb_fix_screeninfo = struct.unpack('16sLIIIIIIIILIIHHH', fb_fix_screeninfo)
        lineLength = fb_fix_screeninfo[8]
    
        fb_var_screeninfo = struct.pack('IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII',
                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
        '''
        struct fb_bitfield {
                __u32 offset;            /* beginning of bitfield    */
                __u32 length;            /* length of bitfield        */
                __u32 msb_right;        /* != 0 : Most significant bit is */ 
                                                /* right */ 
        };
        struct fb_var_screeninfo {
                __u32 xres;            /* visible resolution        */
                __u32 yres;
                __u32 xres_virtual;        /* virtual resolution        */
                __u32 yres_virtual;
                __u32 xoffset;            /* offset from virtual to visible */
                __u32 yoffset;            /* resolution            */
    
                __u32 bits_per_pixel;        /* guess what            */
                __u32 grayscale;        /* 0 = color, 1 = grayscale,    */
                                                /* >1 = FOURCC            */
                struct fb_bitfield red;        /* bitfield in fb mem if true color, */
                struct fb_bitfield green;    /* else only length is significant */
                struct fb_bitfield blue;
                struct fb_bitfield transp;    /* transparency            */    
    
                __u32 nonstd;            /* != 0 Non standard pixel format */
    
                __u32 activate;            /* see FB_ACTIVATE_*        */
    
                __u32 height;            /* height of picture in mm    */
                __u32 width;            /* width of picture in mm     */
    
                __u32 accel_flags;        /* (OBSOLETE) see fb_info.flags */
    
                /* Timing: All values in pixclocks, except pixclock (of course) */
                __u32 pixclock;            /* pixel clock in ps (pico seconds) */
                __u32 left_margin;        /* time from sync to picture    */
                __u32 right_margin;        /* time from picture to sync    */
                __u32 upper_margin;        /* time from sync to picture    */
                __u32 lower_margin;
                __u32 hsync_len;        /* length of horizontal sync    */
                __u32 vsync_len;        /* length of vertical sync    */
                __u32 sync;            /* see FB_SYNC_*        */
                __u32 vmode;            /* see FB_VMODE_*        */
                __u32 rotate;            /* angle we rotate counter clockwise */
                __u32 colorspace;        /* colorspace for FOURCC-based modes */
                __u32 reserved[4];        /* Reserved for future compatibility */
        };'''
        fb_var_screeninfo = fcntl.ioctl(fbfd, 0x4600, fb_var_screeninfo)
        fb_var_screeninfo = struct.unpack('IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', fb_var_screeninfo)
        
        screen_x = fb_var_screeninfo[0]
        screen_y = fb_var_screeninfo[1]
        bitPerPix = fb_var_screeninfo[6]
        print("%d*%d, %dbpp" %(fb_var_screeninfo[0], fb_var_screeninfo[1], fb_var_screeninfo[6]))
        
        screensize = fb_var_screeninfo[0] * fb_var_screeninfo[1] * fb_var_screeninfo[6] / 8
        print 'screensize=' + str(screensize)
        
        with contextlib.closing(mmap.mmap(fbfd.fileno(), screensize, flags=mmap.MAP_SHARED,
                                           access=mmap.ACCESS_WRITE)) as fbp:
    
    ##        print fbp.size()
            loc = 0
            linex = 0
            for y in range(img.shape[0]):
                for x in range(img.shape[1]):
                    
                    loc = (y*lineLength) + (x*bitPerPix/8)
                    fbp[loc] = chr(img[y][x][0])
                    fbp[loc+1] = chr(img[y][x][1])
                    fbp[loc+2] = chr(img[y][x][2])
                    fbp[loc+3] = chr(255)
    ##
    ##        r = fbp.flush()
    
    ##        time.sleep(3)

    资料

    获取framebuffer设备信息.ioctl(int fb,FBIOGET_FSCREENINFO,&finfo);

           ioctl函数是实现对设备的信息获取和设定,第一个参数为文件描述符,第二个参数为具体设备的参数,对于framebuffer,参数在linux/fb.h中定义的。

          #define FBIOGET_VSCREENINFO 0x4600   //获取设备无关的数据信息fb_var_screeninfo
          #define FBIOPUT_VSCREENINFO 0x4601   //设定设备无关的数据信息
          #define FBIOGET_FSCREENINFO 0x4602   //获取设备无关的常值信息fb_fix_screeninfo
          #define FBIOGETCMAP  0x4604        //获取设备无关颜色表信息
          #define FBIOPUTCMAP  0x4605       //设定设备无关颜色表信息
          #define FBIOPAN_DISPLAY  0x4606
          #define FBIO_CURSOR            _IOWR('F', 0x08, struct fb_cursor)

          第三个参数是存放信息的结构体或者缓冲区

  • 相关阅读:
    再次梳理css3动画部分知识
    node搭环境
    微信小程序可用的第三方库
    省市区三级联动下拉框效果分析
    jq回到顶部效果分析
    jq案例中遇到的知识点总结(会飞的小鸟和三级联动)
    js正则表达式大全
    js中表达式 >>> 0 浅析
    为什么js中要用void 0 代替undefined
    npm install、npm install --save、npm install --save --dev、npm install -S、npm install -D的区别
  • 原文地址:https://www.cnblogs.com/lulu147/p/5021349.html
Copyright © 2011-2022 走看看