/*************************

 *bmp.h文件

 *************************/

 #ifndef __BMP_H__
#define __BMP_H__ #include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <arpa/inet.h> //文件头结构体
typedef struct
{
  unsigned char bfType[];    //文件类型
  unsigned long bfSize;     //位图大小
  unsigned short bfReserved1; //位0
  unsigned short bfReserved2; //位0
  unsigned long bfOffBits;    //到数据偏移量
} __attribute__((packed)) BitMapFileHeader;   //使编译器不优化,其大小为14字节 //信息头结构体
typedef struct
{
  unsigned long biSize;          // BitMapFileHeader 字节数
  long biWidth;             //位图宽度
  long biHeight;             //位图高度,正位正向,反之为倒图
  unsigned short biPlanes;        //为目标设备说明位面数,其值将总是被设为1
  unsigned short biBitCount;      //说明比特数/象素,为1、4、8、16、24、或32。
  unsigned long biCompression;    //图象数据压缩的类型没有压缩的类型:BI_RGB
  unsigned long biSizeImage;      //说明图象的大小,以字节为单位
  long biXPelsPerMeter;       //说明水平分辨率
  long biYPelsPerMeter;        //说明垂直分辨率
  unsigned long biClrUsed;       //说明位图实际使用的彩色表中的颜色索引数
  unsigned long biClrImportant;    //对图象显示有重要影响的索引数,0都重要。
} __attribute__((packed)) BitMapInfoHeader; //像素点结构体
typedef struct
{
  unsigned char Blue;      //该颜色的蓝色分量
  unsigned char Green;     //该颜色的绿色分量
  unsigned char Red;    //该颜色的红色分量
  unsigned char Reserved;   //保留值(亮度)
} __attribute__((packed)) RgbQuad; int show_photo(const char *fbp, struct fb_var_screeninfo *scrinfo, const char *bmpname); #endif //__BMP_H__
 /*************************

 *bmp.c文件

 *************************/

 #include "bmp.h"

 /*************************

 *fbp,映射内存起始地址

 *scrinfo,屏幕信息结构体

 *bmpname,.bmp位图文件名

 *************************/
int show_photo(const char *fbp, struct fb_var_screeninfo *scrinfo, const char *bmpname)
{
  if(NULL == fbp || NULL == scrinfo || NULL == bmpname)
    return -;   int line_x = , line_y = ;
  unsigned long tmp = ;
  int xres = scrinfo->xres_virtual;    //屏幕宽(虚拟)
  int bits_per_pixel = scrinfo->bits_per_pixel;  //屏幕位数
  BitMapFileHeader FileHead;
  BitMapInfoHeader InfoHead;
  RgbQuad rgb;       unsigned long location = ;   //打开.bmp文件
  FILE *fb = fopen(bmpname, "rb");
  if (fb == NULL)
  {
    printf("fopen bmp error\r\n");
    return -;
  }   //读文件信息
  if ( != fread( &FileHead, sizeof(BitMapFileHeader),, fb))
  {
    printf("read BitMapFileHeader error!\n");
    fclose(fb);
    return -;
  }
  if (memcmp(FileHead.bfType, "BM", ) != )
  {
    printf("it's not a BMP file\n");
    fclose(fb);
    return -;
  }
  
  //读位图信息
  if ( != fread( (char *)&InfoHead, sizeof(BitMapInfoHeader),, fb))
  {
    printf("read BitMapInfoHeader error!\n");
    fclose(fb);
    return -;
  }
  
  //跳转至数据区
  fseek(fb, FileHead.bfOffBits, SEEK_SET);
  
  int len = InfoHead.biBitCount / ; //原图一个像素占几字节
  int bits_len = bits_per_pixel / ; //屏幕一个像素占几字节  //循环显示   while(!feof(fb))
  {
    tmp = ;
    rgb.Reserved = 0xFF;
  
    if (len != fread((char *)&rgb, , len, fb))
      break;
  
    //计算该像素在映射内存起始地址的偏移量
    location = line_x * bits_len + (InfoHead.biHeight - line_y - ) * xres * bits_len;
  
    tmp |= rgb.Reserved << | rgb.Red << | rgb.Green << | rgb.Blue;
  
    *((unsigned long *)(fbp + location)) = tmp;
  
    line_x++;
    if (line_x == InfoHead.biWidth )
    {
      line_x = ;
      line_y++;
      if(line_y == InfoHead.biHeight)
        break;
    }
  }
  
  fclose(fb);   return ;
}
 /*************************

 *main.c文件

 *************************/

 #include "bmp.h"

 int main()
{
  int devfb, filefb;
  struct fb_var_screeninfo scrinfo;
  unsigned long screensize;
  char *fbp ;
  char bmpname[] = {};   //打开设备文件
  devfb = open("/dev/fb0", O_RDWR);
  if(!devfb)
  {
    printf("devfb open error!\r\n");
    return -;
  }
  //printf("devfb open OK! %d\r\n", devfb);   //获取屏幕信息   //若屏幕显示区域大小不合适,可用ioctl(devfb, FBIOPUT_VSCREENINFO, &scrinfo)设置
  if(ioctl(devfb, FBIOGET_VSCREENINFO, &scrinfo))
  {
    printf("get screen infomation error!\r\n");
    return -;
  }   //printf(".xres=%d, .yres=%d, .bit=%d\r\n",scrinfo.xres, scrinfo.yres, scrinfo.bits_per_pixel);   //printf(".xres_virtual=%d, .yres_virtual=%d\r\n",scrinfo.xres_virtual, scrinfo.yres_virtual);   if( != scrinfo.bits_per_pixel)
  {
    printf("screen infomation.bits error!\r\n");
    return -;
  }   //计算需要的映射内存大小
  screensize = scrinfo.xres_virtual * scrinfo.yres_virtual * scrinfo.bits_per_pixel / ;
  //printf("screensize=%lu!\r\n", screensize);
  
  //内存映射
  fbp = (char *)mmap(NULL, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, devfb, );
  if(- == (int)fbp)
  {
    printf("mmap error!\r\n");
    return -;
  }
  
  scanf("%s", bmpname);
  
  //显示图片
  show_photo(fbp, &scrinfo, bmpname);   //取消映射,关闭文件
  munmap(fbp, screensize);
  close(devfb);   return ;
}

/******************************************

*效果图(我不是给这游戏打广告,只是随手拿了一张图而已)

*说明:1.图片是24位或32位bmp图

     2.屏幕是32位屏幕

     3.不同的设备,可能设备文件不同

     4.需要在root用户下执行

*******************************************/

Linux C语言解析并显示.bmp格式图片的更多相关文章

  1. MFC中显示 .bmp格式的位图

    最近在看VisualC++ 图像处理的书籍,表示一直在从基础做起,今天就记录一个简单功能的实现,显示.bmp格式的位图. 首先需要理解的是窗口创建的过程包括两个步骤:首先擦除窗口的背景,然后在对窗口进 ...

  2. Android显示gif格式图片

    大家知道,在Android中使用ImageView来显示gif格式的图片,我们无法得到gif格式图片该有的效果,它只会停在第一帧上,而不会继续.这时只能看到一张静态的图片,这里我们可以使用个简单的方法 ...

  3. Bmp格式图片与16进制的互相转换简解 Python

    BMP TO HEX 首先介绍Github上一个简单的Bmp转成16进制的py: https://github.com/robertgallup/bmp2hex 网上这种例子很多.思路也简单:将bmp ...

  4. Linux C语言解析.bmp格式图片并显示汉字

    bmp.h 文件 #ifndef __BMP_H__ #define __BMP_H__ #include <unistd.h> #include <stdio.h> #inc ...

  5. IE7/8浏览器都不能显示PNG格式图片

    方法一:重新注册pngfilt.dll文件.这个方法是PNG格式开发商官方网站上的推荐方法之一,抱着试试的想法按网站推荐的方法试了,一试成功.方法如下:使用 开始->运行,在运行输入框中输入 “ ...

  6. bmp格式图片文件读取

    C++读取bmp图片 #include <windows.h> #include <stdio.h> #include <stdlib.h> #include &l ...

  7. 阶段小项目2:显示bin格式图片

    #include<stdlib.h>#include<stdio.h>#include<string.h>#include<error.h>#inclu ...

  8. [自制操作系统] BMP格式文件读取&图形界面系统框架/应用接口设计

    本文将介绍在本人JOS中实现的简单图形界面应用程序接口,应用程序启动器,以及一些利用了图形界面的示例应用程序. 本文主要涉及以下部分: 内核/用户RW/RW调色板framebuffer共享区域 8bi ...

  9. PNG,JPEG,BMP,JIF图片格式详解及其对比

    原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...

随机推荐

  1. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  2. ASP.NET Web API 跨域访问(CORS)

    一.客户端用JSONP请求数据 如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的: {"YourSignatu ...

  3. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  4. 手把手教你写一个RN小程序!

    时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...

  5. WebApi返回Json格式字符串

    WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...

  6. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  7. JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  8. H3 BPM让天下没有难用的流程之产品概述

    一.产品简介 BPM(Business Process Management),是指根据业务环境的变化,推进人与人之间.人与系统之间以及系统与系统之间的整合及调整的经营方法与解决方案的IT工具. H3 ...

  9. Android系统默认对话框添加图片

    开发工具Android Studio 今天公司UI要求软件对话框改成加图片的,以前没有做过,所以就学习了一下,废话不多说, 看效果: 创建XML文件dialog_lsit_item.xml <L ...

  10. Android Studio —— 创建Menu菜单项

    大多数android程序的右上角都会设置一个菜单按钮比如微信的界面右上角的加号. 这个需要在layout同级目录下新建文件夹命名为menu,再右击新建的menu新建xml文件: