Linux C语言解析并显示.bmp格式图片
/************************* *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格式图片的更多相关文章
- MFC中显示 .bmp格式的位图
最近在看VisualC++ 图像处理的书籍,表示一直在从基础做起,今天就记录一个简单功能的实现,显示.bmp格式的位图. 首先需要理解的是窗口创建的过程包括两个步骤:首先擦除窗口的背景,然后在对窗口进 ...
- Android显示gif格式图片
大家知道,在Android中使用ImageView来显示gif格式的图片,我们无法得到gif格式图片该有的效果,它只会停在第一帧上,而不会继续.这时只能看到一张静态的图片,这里我们可以使用个简单的方法 ...
- Bmp格式图片与16进制的互相转换简解 Python
BMP TO HEX 首先介绍Github上一个简单的Bmp转成16进制的py: https://github.com/robertgallup/bmp2hex 网上这种例子很多.思路也简单:将bmp ...
- Linux C语言解析.bmp格式图片并显示汉字
bmp.h 文件 #ifndef __BMP_H__ #define __BMP_H__ #include <unistd.h> #include <stdio.h> #inc ...
- IE7/8浏览器都不能显示PNG格式图片
方法一:重新注册pngfilt.dll文件.这个方法是PNG格式开发商官方网站上的推荐方法之一,抱着试试的想法按网站推荐的方法试了,一试成功.方法如下:使用 开始->运行,在运行输入框中输入 “ ...
- bmp格式图片文件读取
C++读取bmp图片 #include <windows.h> #include <stdio.h> #include <stdlib.h> #include &l ...
- 阶段小项目2:显示bin格式图片
#include<stdlib.h>#include<stdio.h>#include<string.h>#include<error.h>#inclu ...
- [自制操作系统] BMP格式文件读取&图形界面系统框架/应用接口设计
本文将介绍在本人JOS中实现的简单图形界面应用程序接口,应用程序启动器,以及一些利用了图形界面的示例应用程序. 本文主要涉及以下部分: 内核/用户RW/RW调色板framebuffer共享区域 8bi ...
- PNG,JPEG,BMP,JIF图片格式详解及其对比
原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...
随机推荐
- Html Agility Pack 解析Html
Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面 用Fir ...
- document.documentElement.clientHeight 与 document.body.clientHeight(杜绝千篇一律的抄袭!!)
document.documentElement.clientHeight 与 document.body.clientHeight用来获取页面可视高度我觉得有点问题.这两个应该不是一个东西. 页面中 ...
- Eclipse中启动tomcat报错java.lang.OutOfMemoryError: PermGen space的解决方法
有的项目引用了太多的jar包,或者反射生成了太多的类,异或有太多的常量池,就有可能会报java.lang.OutOfMemoryError: PermGen space的错误, 我们知道可以通过jvm ...
- Android数据加密之Base64编码算法
前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...
- PHP static静态属性和静态方法
这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...
- PHP设计模式(七)适配器模式(Adapter For PHP)
适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 如下图(借图): // 设置书的接口 // 书接口 interface BookI ...
- 总结30个CSS3选择器
或许大家平时总是在用的选择器都是:#id .class 以及标签选择器.可是这些还远远不够,为了在开发中更加得心应手,本文总结了30个CSS3选择器,希望对大家有所帮助. 1 *:通用选择器 ;; ...
- 【转】 FineBI:自助式BI工具打造业务分析的“快与准”
如今的企业经营方式,业务对于数据分析有极大的需求,但却苦于没有数据以及工具的有效支持,业务分析仍就依赖于IT报表制作.而IT方不断地按业务需求去调研.确认业务逻辑,然后取数做报表,其中还要忍受业务的需 ...
- Android6.0运行时权限管理
自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...
- 解决maven下载jar慢的问题(如何更换Maven下载源)
修改 配置文件 maven 安装 路径 F:\apache-maven-3.3.9\conf 修改 settings.xml 在 <mirrors> <!-- mirror | Sp ...