c语言读取BMP图片的RGB数据
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。
- 上一篇: PHP安全过滤用户输入
- 下一篇:没有了