1. /*************************
  2.  
  3. *bmp.h文件
  4.  
  5. *************************/
  6.  
  7. #ifndef __BMP_H__
  8. #define __BMP_H__
  9.  
  10. #include <unistd.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <fcntl.h>
  14. #include <string.h>
  15. #include <linux/fb.h>
  16. #include <sys/mman.h>
  17. #include <sys/ioctl.h>
  18. #include <arpa/inet.h>
  19.  
  20. //文件头结构体
  21. typedef struct
  22. {
  23.   unsigned char bfType[];    //文件类型
  24.   unsigned long bfSize;     //位图大小
  25.   unsigned short bfReserved1; //位0
  26.   unsigned short bfReserved2; //位0
  27.   unsigned long bfOffBits;    //到数据偏移量
  28. } __attribute__((packed)) BitMapFileHeader;   //使编译器不优化,其大小为14字节
  29.  
  30. //信息头结构体
  31. typedef struct
  32. {
  33.   unsigned long biSize;          // BitMapFileHeader 字节数
  34.   long biWidth;             //位图宽度
  35.   long biHeight;             //位图高度,正位正向,反之为倒图
  36.   unsigned short biPlanes;        //为目标设备说明位面数,其值将总是被设为1
  37.   unsigned short biBitCount;      //说明比特数/象素,为1、4、8、16、24、或32。
  38.   unsigned long biCompression;    //图象数据压缩的类型没有压缩的类型:BI_RGB
  39.   unsigned long biSizeImage;      //说明图象的大小,以字节为单位
  40.   long biXPelsPerMeter;       //说明水平分辨率
  41.   long biYPelsPerMeter;        //说明垂直分辨率
  42.   unsigned long biClrUsed;       //说明位图实际使用的彩色表中的颜色索引数
  43.   unsigned long biClrImportant;    //对图象显示有重要影响的索引数,0都重要。
  44. } __attribute__((packed)) BitMapInfoHeader;
  45.  
  46. //像素点结构体
  47. typedef struct
  48. {
  49.   unsigned char Blue;      //该颜色的蓝色分量
  50.   unsigned char Green;     //该颜色的绿色分量
  51.   unsigned char Red;    //该颜色的红色分量
  52.   unsigned char Reserved;   //保留值(亮度)
  53. } __attribute__((packed)) RgbQuad;
  54.  
  55. int show_photo(const char *fbp, struct fb_var_screeninfo *scrinfo, const char *bmpname);
  56.  
  57. #endif //__BMP_H__
  1. /*************************
  2.  
  3. *bmp.c文件
  4.  
  5. *************************/
  6.  
  7. #include "bmp.h"
  8.  
  9. /*************************
  10.  
  11. *fbp,映射内存起始地址
  12.  
  13. *scrinfo,屏幕信息结构体
  14.  
  15. *bmpname,.bmp位图文件名
  16.  
  17. *************************/
  18. int show_photo(const char *fbp, struct fb_var_screeninfo *scrinfo, const char *bmpname)
  19. {
  20.   if(NULL == fbp || NULL == scrinfo || NULL == bmpname)
  21.     return -;
  22.  
  23.   int line_x = , line_y = ;
  24.   unsigned long tmp = ;
  25.   int xres = scrinfo->xres_virtual;    //屏幕宽(虚拟)
  26.   int bits_per_pixel = scrinfo->bits_per_pixel;  //屏幕位数
  27.   BitMapFileHeader FileHead;
  28.   BitMapInfoHeader InfoHead;
  29.   RgbQuad rgb;    
  30.  
  31.   unsigned long location = ;
  32.  
  33.   //打开.bmp文件
  34.   FILE *fb = fopen(bmpname, "rb");
  35.   if (fb == NULL)
  36.   {
  37.     printf("fopen bmp error\r\n");
  38.     return -;
  39.   }
  40.  
  41.   //读文件信息
  42.   if ( != fread( &FileHead, sizeof(BitMapFileHeader),, fb))
  43.   {
  44.     printf("read BitMapFileHeader error!\n");
  45.     fclose(fb);
  46.     return -;
  47.   }
  48.   if (memcmp(FileHead.bfType, "BM", ) != )
  49.   {
  50.     printf("it's not a BMP file\n");
  51.     fclose(fb);
  52.     return -;
  53.   }
  54.   
  55.   //读位图信息
  56.   if ( != fread( (char *)&InfoHead, sizeof(BitMapInfoHeader),, fb))
  57.   {
  58.     printf("read BitMapInfoHeader error!\n");
  59.     fclose(fb);
  60.     return -;
  61.   }
  62.   
  63.   //跳转至数据区
  64.   fseek(fb, FileHead.bfOffBits, SEEK_SET);
  65.   
  66.   int len = InfoHead.biBitCount / ; //原图一个像素占几字节
  67.   int bits_len = bits_per_pixel / ; //屏幕一个像素占几字节  //循环显示
  68.  
  69.   while(!feof(fb))
  70.   {
  71.     tmp = ;
  72.     rgb.Reserved = 0xFF;
  73.   
  74.     if (len != fread((char *)&rgb, , len, fb))
  75.       break;
  76.   
  77.     //计算该像素在映射内存起始地址的偏移量
  78.     location = line_x * bits_len + (InfoHead.biHeight - line_y - ) * xres * bits_len;
  79.   
  80.     tmp |= rgb.Reserved << | rgb.Red << | rgb.Green << | rgb.Blue;
  81.   
  82.     *((unsigned long *)(fbp + location)) = tmp;
  83.   
  84.     line_x++;
  85.     if (line_x == InfoHead.biWidth )
  86.     {
  87.       line_x = ;
  88.       line_y++;
  89.       if(line_y == InfoHead.biHeight)
  90.         break;
  91.     }
  92.   }
  93.   
  94.   fclose(fb);
  95.  
  96.   return ;
  97. }
  1. /*************************
  2.  
  3. *main.c文件
  4.  
  5. *************************/
  6.  
  7. #include "bmp.h"
  8.  
  9. int main()
  10. {
  11.   int devfb, filefb;
  12.   struct fb_var_screeninfo scrinfo;
  13.   unsigned long screensize;
  14.   char *fbp ;
  15.   char bmpname[] = {};
  16.  
  17.   //打开设备文件
  18.   devfb = open("/dev/fb0", O_RDWR);
  19.   if(!devfb)
  20.   {
  21.     printf("devfb open error!\r\n");
  22.     return -;
  23.   }
  24.   //printf("devfb open OK! %d\r\n", devfb);
  25.  
  26.   //获取屏幕信息
  27.  
  28.   //若屏幕显示区域大小不合适,可用ioctl(devfb, FBIOPUT_VSCREENINFO, &scrinfo)设置
  29.   if(ioctl(devfb, FBIOGET_VSCREENINFO, &scrinfo))
  30.   {
  31.     printf("get screen infomation error!\r\n");
  32.     return -;
  33.   }
  34.  
  35.   //printf(".xres=%d, .yres=%d, .bit=%d\r\n",scrinfo.xres, scrinfo.yres, scrinfo.bits_per_pixel);
  36.  
  37.   //printf(".xres_virtual=%d, .yres_virtual=%d\r\n",scrinfo.xres_virtual, scrinfo.yres_virtual);
  38.  
  39.   if( != scrinfo.bits_per_pixel)
  40.   {
  41.     printf("screen infomation.bits error!\r\n");
  42.     return -;
  43.   }
  44.  
  45.   //计算需要的映射内存大小
  46.   screensize = scrinfo.xres_virtual * scrinfo.yres_virtual * scrinfo.bits_per_pixel / ;
  47.   //printf("screensize=%lu!\r\n", screensize);
  48.   
  49.   //内存映射
  50.   fbp = (char *)mmap(NULL, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, devfb, );
  51.   if(- == (int)fbp)
  52.   {
  53.     printf("mmap error!\r\n");
  54.     return -;
  55.   }
  56.   
  57.   scanf("%s", bmpname);
  58.   
  59.   //显示图片
  60.   show_photo(fbp, &scrinfo, bmpname);
  61.  
  62.   //取消映射,关闭文件
  63.   munmap(fbp, screensize);
  64.   close(devfb);
  65.  
  66.   return ;
  67. }

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

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

*说明: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. 探索ASP.NET MVC5系列之~~~3.视图篇(下)---包含常用表单和暴力解猜防御

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  2. Android数据加密之Base64编码算法

    前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...

  3. 如何避免git每次提交都输入密码

    在ubuntu系统中,如何避免git每次提交都输入用户名和密码?操作步聚如下:1: cd 回车: 进入当前用户目录下:2: vim .git-credentials (如果没有安装vim 用其它编辑器 ...

  4. CSS——关于z-index及层叠上下文(stacking context)

    以下内容根据CSS规范翻译. z-index 'z-index'Value: auto | <integer> | inheritInitial: autoApplies to: posi ...

  5. iOS之ProtocolBuffer搭建和示例demo

    这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把*.pro ...

  6. Android开发案例 – 在AbsListView中使用倒计时

    在App中, 有多种多样的倒计时需求, 比如: 在单View上, 使用倒计时, 如(如图-1) 在ListView(或者GridView)的ItemView上, 使用倒计时(如图-2) 图-1 图-2 ...

  7. 对Maven、gradle、svn、spring 3.0 fragment、git的想法

    1.Maven Maven可以构建项目,采用pom方式配置主项目和其他需要引用的项目.同时可结合spring3.0的新特性web  fragment. 从现实出发,特别是对于管理不到位,程序员整体素质 ...

  8. NOT IN 和NOT EXISTS

    今天写了一个简单的NOT IN语句,结果跟预期大相径庭,百度之发现深坑一个,遂录之. 登陆账户表logins code name status a admin N b guest N c member ...

  9. Linux自动共享USB设备:udev+Samba

    一.概述 公司最近要我实现USB设备插入Ubuntu后,自动共享到网络上,能像Windows共享一样(如\\192.168.1.10)访问里面的内容,不需要写入权限.当时听完这需求,我这新人表示惊呆了 ...

  10. Javascript高级技巧

    上次整理了Ajax部分,这周看完了高级技巧部分,也整理下吧. 1.类型检测 使用Object.prototype.toString.call(obj)的方式. 因为无论typeof还是instance ...