zoukankan      html  css  js  c++  java
  • bmp图片显示

    文件IO项目:
    在开发板屏幕上循环显示目录里的图片
    a.按照一定的间隔循环显示目录里的bmp图片
    b.实现手指滑动来显示目录里的图片(bmp,jpg)上一张,下一张


    d1:
    1.能操控屏幕(查询开发板屏幕分辨率,以及每个像素点占几个字节)
    命令:FBIOGET_VSCREENINFO
    查询结果保存在些结构中:
    struct fb_var_screeninfo fbinfo;
    __u32 xres; 屏幕分辨率
    __u32 yres;
    __u32 bits_per_pixel; 每个像素点占多少位 /* guess what */

    ioctl(fd,FBIOGET_VSCREENINFO,&fbinfo);
    1.control device
    控制设备

    int ioctl(int fd, int request, ...);
    fd:文件描述符,表示要操作的设备
    request:一般表示一个命令号,该命令由驱动开发者提供
    ...:其它参数,不同的命令参数是不一样的,也由驱动程序员提供

    返回值:返回0
    失败-1
    ------------------------------------------------
    2.功能:映射一个文件或设备到内存,实现像操作普通内存一样去操作文件或设备
    void *mmap(
    void *addr, 把文件内容映射到内存哪个地址,给NULL,让操作系统自动分配
    size_t length,要映射的文件内容的长度
    int prot, 映射的内存区域的权限
    PROT_EXEC 可执行
    PROT_READ 可读
    PROT_WRITE 可写
    int flags,映射标志,决定对映射部分的操作是否对其它进程可见
    MAP_SHARED:共享的,对其它进程可见,内存操作直接应用到文件中去
    MAP_PRIVATE:私有的,对其它进程不可见,内存操作不应用到文件中去

    int fd,文件描述符,要映射的文件
    off_t offset 偏移量,表示文件从哪个位置开始映射
    );

    返回值:成功返回映射内存区域的首地址
    失败返回 MAP_FAILED(-1),同时errno被设置


    int munmap(void *addr, size_t length);
    功能:解除映射
    addr:mmap的返回值
    length:映射内存的长度

    返回值:成功返回0
    失败返回-1




    void *memset(void *s, int c, size_t n);
    s:要设置的内存首地址
    c:要设置的内容
    n:长度

    //struct student s;
    //memset(&s,0,sizeof(s));
    //void *memcpy(void *dest, const void *src, size_t n);

    memcpy(addr,gImage_cat2,800*480*4);


    2.显示图片



    -----------------------------------------
    Linux Frame Buffer:
    帧缓冲设备:
    是对具体图像硬件的一个抽像,它让上层图像应用程序不必关心具体的硬件实现细节。
    在内存(显存)中开辟一段空间,用来保存在屏幕上像素点的颜色值,然后操作屏幕就直接操作这段内存就可以了,这就是说的帧缓冲。

    LCD显示原理:
    屏幕是由y行且每行x个像素点的矩阵组成
    在屏幕上显示图像就是给每个像素点显示一个颜色。

    帧缓冲设备操作流程:
    1.open打开设备
    2.ioctl获取屏幕信息
    3.mmap映射设备到内存
    4.操作显存
    5.munmap解除映射
    6.close关闭文件


    /*************************************************************************
    > File Name: fb_test.c
    > Author: csgec
    > Mail: longer.zhou@gmail.com
    > Created Time: Wed 03 Aug 2016 10:26:59 AM CST
    ************************************************************************/

    #include <stdio.h>
    #include <sys/ioctl.h>
    #include <linux/fb.h>
    #include <fcntl.h>
    #include <sys/mman.h>
    #include <string.h>
    //#include "cat2.h"
    int main(int argc,char *argv[])
    {
    //1.open device
    int fb = open(argv[1],O_RDWR);
    if(fb < 0)
    {
    perror("open");
    return -1;
    }
    //2.查询开发板屏幕分辨率,以及每个像素点占几个字节
    struct fb_var_screeninfo fbinfo;
    int res = ioctl(fb,FBIOGET_VSCREENINFO,&fbinfo);
    if(res != 0)
    {
    perror("ioctl");
    return -1;
    }
    printf("x = %d ",fbinfo.xres);
    printf("y = %d ",fbinfo.yres);
    printf("char_per_pixel = %d ",fbinfo.bits_per_pixel/8);
    //3mmap
    void *addr = mmap(0,800*480*4,PROT_READ | PROT_WRITE,MAP_SHARED,fb,0);
    if(addr == MAP_FAILED)
    {
    perror("mmp");
    return -1;
    }
    printf("addr = %#x ",addr);
    printf("mmp ok ");
    int i ;
    /*
    int *p = (int*)addr;
    for(i = 0; i < 800*480; i++ )
    {
    p[i] = 0xff0000;//red color
    }
    printf("----- ") ;
    */
    char buf[800*480*4];
    int bmp_fd = open(argv[2],O_RDONLY);
    // read(bmp_fd,buf,54);//读掉图片头信息
    lseek(bmp_fd,54,SEEK_SET);
    res = read(bmp_fd,buf,sizeof(buf));
    printf("res = %d ",res);

    memcpy(addr,buf,800*480*4);
    //4.解除映射
    munmap(addr,480*800*4);
    close(fb);

    return 0;
    }

    /*************************************************************************
    > File Name: fb_test.c
    > Author: csgec
    > Mail: longer.zhou@gmail.com
    > Created Time: Wed 03 Aug 2016 10:26:59 AM CST
    ************************************************************************/

    #include <stdio.h>
    #include <sys/ioctl.h>
    #include <linux/fb.h>
    #include <fcntl.h>
    #include <sys/mman.h>
    #include <string.h>

    void draw_point(int *p,int x,int y,int color)
    {
    int *pf = p + (800*y + x);
    *pf = color;

    }
    void draw_bmp(int *pfb,char *bmp)
    {
    printf("draw_bmp ");
    char *p = bmp;
    int i,j,color;
    unsigned char r,g,b;
    for(i = 0; i < 480; i++)
    {
    for(j = 0; j < 800; j++)
    {
    /*
    r = bmp[(i*800+j)*3 + 0];
    g = bmp[(i*800+j)*3 + 1];
    b = bmp[(i*800+j)*3 + 2];
    */
    r = *p++;
    g = *p++;
    b = *p++;
    color = (b << 16) | (g << 8) | r;
    draw_point(pfb,j,479-i,color);
    }
    }
    }
    int main(int argc,char *argv[])
    {
    //1.open device
    int fb = open(argv[1],O_RDWR);
    if(fb < 0)
    {
    perror("open");
    return -1;
    }
    //2.查询开发板屏幕分辨率,以及每个像素点占几个字节
    struct fb_var_screeninfo fbinfo;
    int res = ioctl(fb,FBIOGET_VSCREENINFO,&fbinfo);
    if(res != 0)
    {
    perror("ioctl");
    return -1;
    }
    printf("x = %d ",fbinfo.xres);
    printf("y = %d ",fbinfo.yres);
    printf("char_per_pixel = %d ",fbinfo.bits_per_pixel/8);
    //3mmap
    void *addr = mmap(0,800*480*4,PROT_READ | PROT_WRITE,MAP_SHARED,fb,0);
    if(addr == MAP_FAILED)
    {
    perror("mmp");
    return -1;
    }
    printf("addr = %#x ",addr);
    printf("mmp ok ");
    char buf[800*480*3];
    int bmp_fd = open(argv[2],O_RDONLY);
    // read(bmp_fd,buf,54);//读掉图片头信息
    lseek(bmp_fd,54,SEEK_SET);
    res = read(bmp_fd,buf,sizeof(buf));
    printf("res = %d ",res);
    draw_bmp(addr,buf);
    //4.解除映射
    munmap(addr,480*800*4);
    close(fb);

    return 0;
    }

  • 相关阅读:
    Nova官方资料入口处
    LeetCode 有效的数独
    LeetCode 两数之和
    LeetCode 移动零
    安装OpenStack Queens版本的教程推荐
    删除排序数组中的重复项
    (转载)OpenStack client 调用分析
    (转载)基于Linux C的socket抓包程序和Package分析
    Maven的具体使用和优点
    关于 Javascript 学习,有哪些好的博客或者网站推荐?
  • 原文地址:https://www.cnblogs.com/liudehao/p/5753989.html
Copyright © 2011-2022 走看看