打印

BMP图片分析显示 一些自己学习LINUX环境下编程资料分享

[复制链接]
137|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
关于在ARM9开发板上的BMP图片显示源代码和相关的详解!








1、显示器,显示最小的单位:像素点(开发板的分辨率是800X480)  

   

    怎么样去表示每一个像素点?

    比如说只有一个位,来显示,那只能显示白色和黑色,比如说有 8bit -> 1Byte 有2^8种情况,位数越大,所能表示的颜色就越多



    三原色( ARGB )  8:8:8:8 每一个像素点有32位来表示

         ABGR

   

    char buf[4];

    int size;

    int r;



    fd = open("1.bmp",O_RDONLY);

    lseek(fd,2,SEEK_SET);

    r = read(fd,buf,4);

   

    size = (buf[3] & 0xff) << 24 | (buf[2] & 0xff) << 16 | (buf[1] & 0xff) << 8 | (buf[0] & 0xff) << 0;

   

    头两个字节,分辨率,大小,位深



   

    read(fd,buf,2);

   

    buf[1] << 8 | buf[0]





2、开发环境搭建和使用

    安装minicom

        sudo apt-get install minicom



    网络问题:

    vim /etc/network/interfaces

    auto eth0

    iface eth0 inet static

    address 192.168.5.3

    netmask 255.255.255.0

    gateway 192.168.5.1

    dns-nameserver 192.168.5.1



    sudo ifconfig eth0  IP

    sudo route add default gw 192.168.5.1

    ping www.baidu.com

    sudo vim /etc/resolv.conf  添加一行  ->  nameserver 192.168.5.1



   

3、minicom的使用



    dmesg查看USB转串口是否链接到虚拟机。 /dev/ttyUSB0

   

    配置minicom

        sudo minicom -s  ---> Serial port setup

   

    +-----------------------------------------------------------------------+

    | A -    Serial Device      : /dev/ttyUSB0                              |

    | B - Lockfile Location     : /var/lock                                 |

    | C -   Callin Program      :                                           |

    | D -  Callout Program      :                                           |

    | E -    Bps/Par/Bits       : 115200 8N1                                |

    | F - Hardware Flow Control : No                                        |

    | G - Software Flow Control : No                                        |

    |                                                                       |

    |    Change which setting?                                              |

    +-----------------------------------------------------------------------+

    按对应的字母进入对应的选项来修改设置,修改好之后,回车结束。



    然后选择 Save setup as dfl 保存为默认的配置,以后就不需要再进行配置了。



    Exit from Minicom



    $ sudo minicom  -c on

    退出 ctrl + a 然后再按q退出







4、LCD的使用

   

    打开对应的设备节点,往framebuffer写入显示的数据



    #include <stdio.h>

    #include <fcntl.h>



    int main()

    {

        int fd ;

        int lcd_buf[800*480];//ARGB -> 4个字节

        int i;



        for(i=0;i<800*480;i++){

            lcd_buf[ i] = 0x00FF0000;

        }   



        fd = open("/dev/fb0",O_RDWR);

        if(fd < 0)

        {   

            perror("open fail");

            return -1;

        }   



    write(fd,lcd_buf,800*480*4);



    close(fd);

        return 0;

    }

    编译: arm-linux-gcc -o lcd lcd.c



    然后通过串口下载到开发板

    #rx lcd

    #chmod 777 lcd

    #./lcd

    #ps (查看当前后台运行的iot程序,然后把这个iot程序杀死 ,kill 对应的进程号码)





5、将framebuffer映射到我们进程空间

    首先我们要根据显示设备进行映射,就要获取到它的硬件信息,这个信息在这个头文件有定义:vim /usr/include/linux/fb.h





238 struct fb_var_screeninfo {

239     __u32 xres;         /* 宽 度  w      */

240     __u32 yres;        //高度     h

245

246     __u32 bits_per_pixel;       /* 每一个像素用多少位来表示        */

    }



    FBIOGET_VSCREENINFO





#include <stdio.h>

#include <fcntl.h>

#include <sys/ioctl.h>

#include <linux/fb.h>

#include <sys/mman.h>



int main()

{

    int fd;

    int *plcd=NULL;



    fd = open("/dev/fb0",O_RDWR);

    if(fd < 0)

    {

        perror("open lcd fail");

        return -1;

    }

    struct fb_var_screeninfo fbinfo;



    ioctl(fd,FBIOGET_VSCREENINFO,&fbinfo);

    printf("x:%d y:%d bit_per_pixel:%d\n",fbinfo.xres,fbinfo.yres,fbinfo.bits_per_pixel);



    plcd = mmap(

        NULL ,//表示映射的地址,为空让系统自动分配

        fbinfo.xres*fbinfo.yres*fbinfo.bits_per_pixel/8,//分配内存的大小

        PROT_WRITE,//对这个内存区域访问的权限

        MAP_SHARED,//其他进程访问的权限

        fd,

        0//偏移量

            );

    if(plcd == MAP_FAILED)

        {

            perror("mmap fail");

            close(fd);

            return -1;

        }

    int x,y;

    for(y=0;y<480;y++)

    {

        for(x=0;x<800;x++)

        {

            *(plcd + x + y*800) = 0x000000FF;

        }

    }



    close(fd);

    munmap(plcd,fbinfo.xres*fbinfo.yres*fbinfo.bits_per_pixel/8);

    return 0;

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

376

主题

377

帖子

0

粉丝