c语言读取BMP图片的RGB数据

BMP图片是位图(bitmap),一般未压缩,要读取BMP文件只要知道它的文件结构就可以了,具体格式可以百度或者google,就不多说了,几个重要的点在代码里面有注释。

/**
	c语言读取位图信息 
**/

#include
#include

#define BM 19778		// 位图的标志

#define PATH "d:\\test.bmp"  //打开的文件路径 

//判断是否是位图,在0-1字节 
int IsBitMap(FILE *fp)
{
	unsigned short s;
	fread(&s,1,2,fp);
	if(s==BM)
		return 1;
	else
		return 0;
} 

//获得图片的宽度,在18-21字节 
long getWidth(FILE *fp)
{
	long width;
	fseek(fp,18,SEEK_SET);
	fread(&width,1,4,fp);
	return width;	
}

//获得图片的高度 ,在22-25字节 
long getHeight(FILE *fp)
{
	long height;
	fseek(fp,22,SEEK_SET);
	fread(&height,1,4,fp);
	return height;	
}  

//获得每个像素的位数,在28-29字节 
unsigned short getBit(FILE *fp)
{
	unsigned short bit;
	fseek(fp,28,SEEK_SET);
	fread(&bit,1,2,fp);
	return bit;
} 

//获得数据的起始位置
unsigned int getOffSet(FILE *fp)
{
	unsigned int OffSet;
	fseek(fp,10L,SEEK_SET);
	fread(&OffSet,1,4,fp);
	return OffSet;
}

//获得图像的数据
void getData(FILE* fp,unsigned char *r,unsigned char *g,unsigned char *b)
{
    FILE* fpr;
	FILE* fpg;
	FILE* fpb;
	
	int i, j=0;
	int stride;
	unsigned char* pix=NULL;
	long height,width;
	height=getHeight(fp);
	width=getWidth(fp);

	fseek(fp, getOffSet(fp), SEEK_SET);	//找到位图的数据区 
	
	stride=(24*width+31)/8;	//对齐,计算一个width有多少个8位 
	stride=stride/4*4;		//取四的倍数 r,g,b,alph 
	
	//写入数组 
	pix=(unsigned char *)malloc(stride);
	for(j=0;j


你可能感兴趣的:(c语言和算法)