bmp文件的结构比较简单,主要包括文件头,BMP信息头,BMP数据内容。文件头BITMAPFILEHEADER结构为:
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 <pshpack2.h>
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;来源:考试大
有一次,一个朋友给了一套BMP文字的图片,想把BMP转化为字库,需要去掉BMP的头和BMP信息,只取数据部分,并存为数组,就根据BMP结构,写了如下一个小程序,主要包括文件读写,文件查找等:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
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
责任编辑:小草