BMP之二:转成RAW文件及应用

RAW文件是位图的图像数据,根据不同的BMP格式它的内容和使用场合都有不同。比如在嵌入式系统中,显示LOGO要使用BMP图,只需要往映射地址放入像素的RGB数据即可实现。以下举一个DOS程序实例,把16位BMP转成十六进制RAW数据。

(1)主函数。因为main可以利用argv带参数,,可处理同一路径下的具体文件。

int main(int argc, char *argv[]){FILE *fp_s=NULL;BITMAPFILEHEADER biFileHeader;BITMAPINFOHEADER biInfoHeader;PBITMAPFILEHEADER pbiFileHeader= &biFileHeader;PBITMAPINFOHEADER pbiInfoHeader= &biInfoHeader;if(!(fp_s=fopen(argv[1],"r+b")))//以二进制可读方式打开流文件{printf("打开文件不成功!");return 1;}//读取文件头if(!(GetBitmapHeader(fp_s, pbiFileHeader, pbiInfoHeader))){printf("读取文件头不成功!");return 1;}//用读取的数据头生成文件if(!(GenerateIFile(pbiFileHeader,pbiInfoHeader,fp_s, argv))){printf("生成i文件失败!");return 1;}if(fclose(fp_s)==EOF)printf("关闭失败!");return 0;}

(2)获取头文件信息函数

int GetBitmapHeader(FILE *fp, BITMAPFILEHEADER *bfhp, BITMAPINFOHEADER *bihp){//设置文件读写位置为开头if((fseek(fp,0,SEEK_SET)==-1)){puts("GetBitmapHeader定位失败!");return 0;}//读取fileheaderif(!(fread(bfhp,sizeof(BITMAPFILEHEADER),1,fp))){puts("GetBitmapHeader读取fileheader失败!");return 0;}//读取fileheader后的位置long i; if((i=ftell(fp))==-1L){puts("GetBitmapHeader读取文件指针位置失败!");return 0;}elseprintf("当前位置为:%d\n",i);//if(!(fread(bihp, sizeof(BITMAPINFOHEADER), 1, fp))){puts("读取infoheader失败!");return 0;}if((i=ftell(fp))==-1L){puts("读取文件指针位置失败!");return 0;}elseprintf("当前位置为:%d\n",i);return 1;}

(3)生成raw文本文件

int GenerateIFile(PBITMAPFILEHEADER bfhp, PBITMAPINFOHEADER bihp, FILE *fp_s, char **stringp){//检查是倒序文件还是正序文件if( bihp->biHeight > 0 )puts("GenerateIFile该文件为倒序文件!");else{puts("GenerateIFile该文件为正序文件!");return 0;}//检查是否压缩,只处理BI_BITFIELDS的情况if( bihp->biCompression == BI_BITFIELDS )//#define BI_BITFIELDS 3puts("GenerateIFile该文件为BI_BITFIELDS压缩格式!");else{printf("BI_BITFIELDS=%d\n", bihp->biCompression);puts("GenerateIFile该文件不为BI_BITFIELDS压缩格式!");return 0;}//检查文件类型if(bfhp->bfType==19778)//’M’ ‘B’puts("该文件为bmp格式!");else {puts("该文件不为bmp格式!");return 0;}//检查像素位数if(bihp->biBitCount==16)puts("该bmp文件为16位!");else {puts("该bmp文件不为16位!");return 0;}printf("the start of the image area is %d\n",bfhp->bfOffBits);printf("the size of the image area is %d\n",bihp->biSizeImage);printf("the height of the image is %d\n", bihp->biHeight);printf("the width of the image is %d\n", bihp->biWidth);//开辟一个数据缓冲区,存储image区的数据short *pimage=NULL;pimage=(short *)malloc((bihp->biHeight * bihp->biWidth)*2);if(pimage== NULL){printf("分配缓冲区失败!");return 0;}fseek(fp_s, bfhp->bfOffBits, SEEK_SET);//定位文件指针到数据区printf(" %d\n",ftell(fp_s));if(!(fread(pimage, 1, bihp->biHeight * bihp->biWidth*2, fp_s))) //填充缓冲区{printf("填充数据缓存失败!");return 0;}//重列顺序并且生成文件if(!(RerangeData(bfhp, bihp, pimage, stringp))){printf("RerangeData函数失败!");return 0;}//释放缓冲区free(pimage);return 1;}

未完待续。。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

大多数人想要改造这个世界,但却罕有人想改造自己。

BMP之二:转成RAW文件及应用

相关文章:

你感兴趣的文章:

标签云: