入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

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

创建时间:2013-04-08 投稿人: 浏览次数:4102

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

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

#include<stdio.h>
#include<malloc.h>

#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<height;j++)
	{
	   fread(pix, 1, stride, fp);
	   for(i=0;i<width;i++)
		{
			*(r+(height-1-j)+i)=pix[i*3+2];
			*(g+(height-1-j)+i)=pix[i*3+1];
			*(b+(height-1-j)+i)=pix[i*3];
		}
	}
	
	//写入文件 
	fpr=fopen("d:\bmpr.txt","w+");
	fpg=fopen("d:\bmpg.txt","w+");
	fpb=fopen("d:\bmpb.txt","w+");
	
	for(i =0; i < height; i++)
     {
		for(j = 0; j < width-1; j++)
		{   
		fprintf(fpr,"%4d",*(r+i+j));
		fprintf(fpg,"%4d",*(g+i+j));
		fprintf(fpb,"%4d",*(b+i+j));
		}
		fprintf(fpr,"%4d",*(r+i+j));
		fprintf(fpg,"%4d",*(g+i+j));
		fprintf(fpb,"%4d",*(b+i+j));
 	}
	  
	fclose(fpr);
	fclose(fpg);
	fclose(fpb);
		 
} 


int main()
{
	long width,height;
	FILE *fp=fopen(PATH,"r");
	unsigned char *r,*g,*b;
	int i,j;
	r=(unsigned char *)malloc(4000);
	b=(unsigned char *)malloc(4000);
	g=(unsigned char *)malloc(4000);
	
	if(IsBitMap(fp))
		printf("该文件是位图!
");
	else
		{
			printf("该文件不是位图!
");
			fclose(fp);
			return 0; 
		} 
			
	printf("width=%ld
height=%ld
",getWidth(fp),getHeight(fp));
	
	printf("该图像是%d位图
",getBit(fp));
	
	printf("OffSet=%d
",getOffSet(fp));
		
	getData(fp,r,g,b);
	
	return 1;
}


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。