bmp文件c语言程序解读,bmp文件头_C语言解析BMP文件的结构

摘要 腾兴网为您分享:C语言解析BMP文件的结构,周公解梦,小睡眠,完美志愿,琦书屋等软件知识,以及今日头条,广告点击软件,迅雷资源搜索引擎,东兴证券软件,一键盘锁屏,鸿合白板软件,微信特殊字体,最好的gba,威海政务网,好豆菜谱,二次元壁纸软件,乐金所,车宝贝,黄金弹头,空间刷赞神器等软件it资讯,欢迎关注腾兴网。Windows GDI提供了 typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER, *PBITMAPFILEHEADER; BMP信息头BITMAPINFO结构为: typedef struct tagBITMAPINF...

Windows   GDI提供了

typedef   struct   tagBITMAPFILEHEADER   {

WORD         bfType;

DWORD       bfSize;

WORD         bfReserved1;

WORD         bfReserved2;

DWORD       bfOffBits;

}   BITMAPFILEHEADER,   *PBITMAPFILEHEADER;

BMP信息头BITMAPINFO结构为:

typedef struct tagBITMAPINFO {

BITMAPINFOHEADER    bmiHeader;

RGBQUAD             bmiColors[1];

} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;

typedef struct tagBITMAPCOREINFO {

BITMAPCOREHEADER    bmciHeader;

RGBTRIPLE           bmciColors[1];

} BITMAPCOREINFO, FAR *LPBITMAPCOREINFO, *PBITMAPCOREINFO;

#include

typedef struct tagBITMAPFILEHEADER {

WORD    bfType;

DWORD   bfSize;

WORD    bfReserved1;

WORD    bfReserved2;

DWORD   bfOffBits;

} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

有一次,一个朋友给了一套BMP文字的图片,想把BMP转化为字库,需要去掉BMP的头和BMP信息,只取数据部分,并存为数组,就根据BMP结构,写了如下一个小程序,主要包括文件读写,文件查找等:

#include

#include

#include

#include

BITMAPFILEHEADER file_head;

BITMAPINFO fileinfo;

//把彩色的图转为黑白色,输入源文件名字和转出的文件名字

#define FONT_WIDTH_1 (28)

#define FONT_WIDTH_2 (22)

char * getfilename(char * filename)

{

char strResult[128]={0}; //保存结果

char *temp, *ret;

temp = filename;

int nStrLen = strlen(filename); //原始字符串长度

for(int i = nStrLen; i > 0; i--) //倒查,每个字符和反斜杠对比

{

if (filename[i] == '\')    //如果当前字符是反斜杠

{

//复制倒数第一个斜杠后的数据,并去掉.bmp

strncpy(strResult, (char *)(temp i 1), nStrLen-i-1-4); break;

}

else

{

//复制字符串,去掉.bmp

if (i = 1)

{

strncpy(strResult, (char *)temp, nStrLen-4);

break;

}

}

}

ret = strResult;

return (ret);

}

#if 1

char * getfilepath(char * filename)

{

char strResult[128] = {0}; //保存结果

char *temp, *ret;

temp = filename;

int nStrLen = strlen(filename); //原始字符串长度

for(int i = nStrLen; i > 0; i--) //倒查,每个字符和斜杠对比

{

if (filename[i] == '\') //如果当前字符是斜杠

{

//复制路径,包括斜杠

strncpy(strResult, (char *)temp, i 1);

break;

}

}

ret = strResult;

return (ret);

}

#endif

int colorbmp2bwbmp(char * f_in, char * f_out)

{

int infileLen;            //文件长度

int n=0;                  //n 字节计数器

unsigned char c,c_in;     //C_in文件字节,C转化

FILE *fh_in;

FILE *fh_out;

assert((f_in != NULL) && (f_out != NULL));

fh_in=fopen(f_in,"rb");

if (NULL==fh_in)

{

printf("open read file error!!");

return 1;

}

fseek(fh_in,0,SEEK_END);

infileLen=ftell(fh_in);

fseek(fh_in,0,SEEK_SET);

/*read bmp file head,14 BYTE*/

if (sizeof(file_head)!=fread(&file_head,1,sizeof(file_head),fh_in))

{

printf("read bmp file error!!");

fclose(fh_in);

return 1;

}

/*判断是不是BMP文件*/

if (file_head.bfType!=0x4d42)

{

printf("bmp file error!!");

fclose(fh_in);

return 1;

}

/*文件指针移到文件开始处*/

fseek(fh_in,0,SEEK_SET);

fh_out=fopen(f_out,"wb");

if (NULL==fh_out)

{

printf("open write file error!!");

return 1;

}

/*把文件头读入目标文件*/

while((int)file_head.bfOffBits--)

{

c_in=getc(fh_in);

c=c_in;

putc(c,fh_out);

}

/*转为黑白片*/

while (n

{

c_in=getc(fh_in);

c=c_in;

if (c>0x7f)

{

c =0xff;

}

else

{

c = 0x00;

}

putc(c,fh_out);

n;

}

fclose(fh_in);

fclose(fh_out);

return 0;

}

//byte转为BIT

void ByteToBit(char *Out, const char *In, unsigned char bits)

{

unsigned char i;

for(i=0; i

{

Out[i] = (In[i/8]>>(i%8)) & 1;

}

}

//BIT转为byte

void BitToByte(char * Out, const char *In, unsigned bits)

{

unsigned char i;

memset(Out, 0, (bits 7)/8);

for(i=0; i

{

Out[i/8] |= In[i]<

}

}

//把位图转为文件,输入bmp文件名和头文件名

int bmp2headfile(char * bmpfile, char * headfile)

{

int infileLen;             //文件长度

int n=0,num=1;             //n 字节计数器, NUM换行指示

unsigned char c, c_in;     //C_in文件字节,C转化

FILE *fh_in;

FILE *fh_out;

char com[256]={0};

char ch[2]={0};

long wid, hig;

assert((bmpfile != NULL) && (headfile != NULL));

fh_in=fopen(bmpfile,"rb");

if (NULL==fh_in)

{

printf("open read file error!!");

return 1;

}

fseek(fh_in,0,SEEK_END);

infileLen=ftell(fh_in);

fseek(fh_in,0,SEEK_SET);

/*读取BMP文件头*/

if (sizeof(file_head)!=fread(&file_head,1,sizeof(file_head),fh_in))

{

printf("read bmp file error!!");

fclose(fh_in);

return 1;

}

/*读取BMP文件信息*/

if (sizeof(fileinfo)!=fread(&fileinfo,1,sizeof(fileinfo),fh_in))

{

printf("read bmp file error!!");

fclose(fh_in);

return 1;

}

/*判断是不是BMP图片*/

if (file_head.bfType!=0x4d42)

{

printf("bmp file error!!");

fclose(fh_in);

return 1;

}

fseek(fh_in,file_head.bfOffBits,SEEK_SET);

fh_out=fopen(headfile,"ab");

if (NULL==fh_out)

{

printf("open write file error!!");

return 1;

}

/*写入注释*/

memcpy(ch, getfilename(bmpfile), sizeof(getfilename(bmpfile)));

wid = fileinfo.bmiHeader.biWidth;

hig = fileinfo.bmiHeader.biHeight;

sprintf(com, "/*The size is :%dX%d. The char is : %s.*/", wid, hig, ch);

fputs(com, fh_out);

putc(0x0d,fh_out);

putc('n',fh_out);

/*写入数据*/

while (n

{

putc('0',fh_out);

putc('X',fh_out);

c_in=getc(fh_in);

c=c_in;

c=(c>>4)&0x0f;        //获取高四个BIT的内容

if (c<0x0a)

{

   c =0x30;        //把符号转成数字

}

else

{

c =0x37;         //转成a到f

}

putc(c,fh_out);

c=c_in&0x0f;    //获取低四个BIT内容

if (c<0x0a)

{

c =0x30;

}

else

{

c =0x37;

}

putc(c,fh_out);

putc(',',fh_out);

n;

if (num % (fileinfo.bmiHeader.biWidth/8 1) ==0)

{

putc(0x0d,fh_out);

putc('n',fh_out);

}

}

putc(0x0d,fh_out);

putc('n',fh_out);

fclose(fh_in);

fclose(fh_out);

return 0;

}

int main(int argc, char* argv[])

{

WIN32_FIND_DATA fd;

if (argc>2)

{

printf("***************位图帮助***************n");

printf("bmptofile [drive:][path][filename]");

return 1;

}

else if (argc == 2)

{

if (strchr(argv[1], '.')!=NULL)

{

bmp2headfile(argv[1], (char *)"font.h");

}

else //if (memcmp(argv[1], "?", sizeof(argv[1])) == 0)

{

printf("***************位图帮助***************n");

printf("bmptofile [drive:][path][filename]");

return 1;

}

}

else if (argc == 1)

{

HANDLE hd=::FindFirstFile((LPCTSTR)"*.bmp",&fd);  //开始查找

if(hd==INVALID_HANDLE_VALUE)

{

printf("没有找到文件");

return 0;

}

bmp2headfile(fd.cFileName, (char *)"font.h");

while(FindNextFile(hd,&fd)) //继续查找

{

bmp2headfile(fd.cFileName, (char *)"font.h");

}

FindClose(hd);//关闭查找

}

return 0;

}

相关推荐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Outlook 2007连接到Exchange Server 2003、2007时出现没有默认网关的错误

在使用Outlook 2007作为客户端连接到Exchange Server 2003/2007时&#xff0c;会出现一个错误提示&#xff1a;"到Microsoft Exchange的连接不可用。您的网络适配器没有默认网关。"解决方法&#xff1a;1. 单击“开始”&#xff0c;单击“运行”&#xff0c;在“打开…

C# WPF MVVM开发框架Caliburn.Micro入门介绍①

01—Caliburn.Micro简介Caliburn.Micro是一套基于XAML的MVVM模式的开发框架&#xff0c;它小巧而强大。在CaliburnMicro中只需要按照约定把View的名字加上后缀ViewModel&#xff0c;就是它的View Model 的名字&#xff0c;如:MainPage和 MainPageViewModel。Caliburn.Micro自动…

深度分析 Java 的 ClassLoader 机制(源码级别)(转)

写在前面&#xff1a;Java中的所有类&#xff0c;必须被装载到jvm中才能运行&#xff0c;这个装载工作是由jvm中的类装载器完成的&#xff0c;类装载器所做的工作实质是把类文件从硬盘读取到内存中&#xff0c;JVM在加载类的时候&#xff0c;都是通过ClassLoader的loadClass&am…

Struts2和Struts1的不同

转载&#xff08;没看懂&#xff09; Action 类 ◆Struts1要求Action类继承一个抽象基类org.apache.struts.action.Action。Struts1的一个普遍问题是使用抽象类编程而不是接口。 ◆Struts 2 Action类可以实现一个Action接口&#xff0c;也可实现其他接口&#xff0c;使可选和定…

拉屎能赚钱?在马桶上月入过万?原来卫生间里还有这么多隐藏福利,超模君都惊了……

全世界只有3.14 % 的人关注了爆炸吧知识模友们&#xff0c;你们有过“带薪拉屎”的经历吗&#xff1f;没错&#xff0c;假如我们每天花10分钟“带薪拉屎”&#xff0c;那一年大概能积攒下来40小时&#xff0c;假如我们每天工作8小时&#xff0c;等于多了5天年假&#xff0c;白嫖…

Android之让图片匀速旋转效果

图片匀速旋转 当我们更新的时候,需要把更新小图标旋转起来,不废话,先爆照 介绍动画: Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类是 Frame 动画,即顺序播放事先…

C语言计算一个数的平方根立方根,怎样快速计算出一个数的平方根立方根?

我定义a^bab(10a b)^2 100a^2 20ab b^2 100a^2 b(20a b)a代表已经计算结b代表前需要计算位数每计算程100a^2都减掉剩b(20a b)需要做找整数b使b(20a b)>b,(10*a b)^n-(10*a)^n≈n*(10*a)^(n-1)*b,即:b≈41221398234/n/(10*a)^(n-1)41221398234/5/180^4≈7。85,取b7各步都更…

百度语言翻译机

百度语言翻译机 2006 年百度之星程序设计大赛初赛题目 6 百度语言翻译机 时限 1s 百度的工程师们是非常注重效率的&#xff0c;在长期的开发与测试过程中&#xff0c;他们逐渐创造了一套他们独特的缩率语。他们在平时的交谈&#xff0c;会议&#xff0c;甚至在各中技术文档中都…

Android之如何使用快速联系徽章

翻译地址:http://code.tutsplus.com/tutorials/android-quick-tip-using-the-quick-contact-badge--mobile-2245 如果你花任何时间在一个Android设备,您可能已经注意到你可以点击小图片联系如何启动一个工具栏与很多不同的行为,如电话、短信、邮件的人。 在这个快速提示,您…

dotnet 使用 Infer# 自动分析代码缺陷

本文告诉大家如何使用 Infer# 开源库配合 GitHub 的 Action 实现自动分析代码缺陷&#xff0c;如找到可空引用或线程安全等问题这是一个在 GitHub 上完全开源的仓库&#xff0c;请看 https://github.com/microsoft/infersharp刚好今天收到了 Infer# 发布 1.2 版本博客&#xff…

发了篇paper,双非二本的她直博浙大

全世界只有3.14 % 的人关注了爆炸吧知识大家好&#xff0c;我是小南&#xff0c;本科就读于国内某双非二本院校&#xff0c;于2019年拿到了浙江大学的直博录取函。很多人问我从二本院校成功跨越到国内知名高校的秘诀是什么&#xff0c;我个人觉得&#xff0c;除开运气&#xff…

FZU 2095 水面高度

一共六种情况。手算即可。 #include<cstdio> #include<cstring> #include<cmath>int T; double a,b,c,d,x; double ans;int main() {scanf("%d",&T);while(T--){scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&x);doubl…

android+清除循环动画,android - 如何使用ViewPropertyAnimator生成循环动画?

我想构建一个TextViews动画&#xff0c;在完成后会自动重复。对于我要设置动画的每个View&#xff0c;我使用以下代码final float oldX v.getX();final float newX v.getX() - (float)totalWidth;final AnimatorListenerAdapter listener new AnimatorListenerAdapter() {Ov…

(转)matlab各类数学公式

matlab矩阵应用clear%建立矩阵的两种方式A1 [1 2 3 4 5; 6 7 8 9 10];A2 [ 1 2 3 4 5 6 7 8 9 10 ];%一种是换行用引号&#xff0c;一种是自然写法 clearA [5 4 3 2 1; 6 7 8 9 10;1 2 3 4 5;24 24 24 24 24;25 25 25 25 25];B [5 4 3 2 1; 6 7 8 9 10;…

PS网页设计教程XVI——在PS中创建一个摩登实验室风格的网页设计

作为编码者&#xff0c;美工基础是偏弱的。我们可以参考一些成熟的网页PS教程&#xff0c;提高自身的设计能力。套用一句话&#xff0c;“熟读唐诗三百首&#xff0c;不会作诗也会吟”。 本系列的教程来源于网上的PS教程&#xff0c;都是国外的&#xff0c;全英文的。本人尝试翻…

好评率超高的9个公众号,值得收藏

不管世界变化多快&#xff0c;阅读仍是个不过时的动作。今天就为大家推荐几个优质公众号&#xff0c;从社会热点、读书成长、生活新知&#xff0c;你的碎片化时间&#xff0c;我们包了&#xff01;一起来看看呀~长按二维码&#xff0c;“识别图中二维码”即可订阅————电商头…

.NET 6新特性试用 | 文件范围的命名空间

前言在前面的《隐式using指令》文章中&#xff0c;我们介绍了global using&#xff0c;可以减少我们代码文件中的“噪音”&#xff0c;使代码更简洁。今天&#xff0c;我们介绍.NET 6中另一个简化代码的方式——文件范围的命名空间。Demo当我们向项目中添加一个类文件时&#x…

php的几种运行模式CLI、CGI、FastCGI、mod_php

1、CLI:就是命令行&#xff0c;例如可以在控制台或者是shell中键入命令: php -f index.php 然后获取输出 2、CGI:以下是不同的说法与理解 公共网关接口”(Common Gateway Interface)&#xff0c;HTTP服务器 与你的或其它机器上的程序 进行 “交谈”的一种工具 &#xff0c;其程…

Android之三大图片缓存原理、特性对比

一. 四大图片缓存基本信息 Universal ImageLoader 是很早开源的图片缓存&#xff0c;在早期被很多应用使用。Picasso 是 Square 开源的项目&#xff0c;且他的主导者是 JakeWharton&#xff0c;所以广为人知。Glide 是 Google 员工的开源项目&#xff0c;被一些 Google App 使用…

android宿舍管理系统源码,基于android操作系统的手机宿舍管理系统使用手册

《基于android操作系统的手机宿舍管理系统使用手册》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《基于android操作系统的手机宿舍管理系统使用手册(5页珍藏版)》请在人人文库网上搜索。1、基于an droid操作系统的手机宿舍管理系统使用手册 1 系统概述 本系统是在an…