256级灰度BMP文件读写的源代码c语言图像处理.docVIP

256级灰度BMP文件读写的源代码c语言图像处理.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
本文档最早发布于 /u/1495182054 1.256级灰度BMP文件读写的源代码! 首先要明白256级灰度BMP文件的格式 1.首先是一个14个字节的文件头,定义如下 typedef struct tagBITMAPFILEHEADER{ ? WORD??? bfType; ? DWORD?? bfSize; ? WORD??? bfReserved1; ? WORD??? bfReserved2; ? DWORD?? bfOffBits; } BITMAPFILEHEADER, *PBITMAPFILEHEADER; bfType是表明BMP文件类型的数据,在这里我们填入的是0x4d42,其实就是BM两个字,bfSize是文件大小,bfOffBits是文件头到数据块的偏移量,对于256级灰度图,就是1078个字节,后面会做描述 2.接下来是40个字节的是描述位图属性的40个字节 typedef struct tagBITMAPINFOHEADER{ ? DWORD? biSize; ? LONG?? biWidth; ? LONG?? biHeight; ? WORD?? biPlanes; ? WORD?? biBitCount; ? DWORD? biCompression; ? DWORD? biSizeImage; ? LONG?? biXPelsPerMeter; ? LONG?? biYPelsPerMeter; ? DWORD? biClrUsed; ? DWORD? biClrImportant; } BITMAPINFOHEADER, *PBITMAPINFOHEADER; ? 这里面只有biWidth表示宽度,biPlanes表示高度,biBitCount对于256级灰度正好是83.由于是256级灰度图,那么有256个调色板数据,每个调色板是如下定义的 typedef struct tagRGBQUAD { ??? BYTE??? rgbBlue; ??? BYTE??? rgbGreen; ??? BYTE??? rgbRed; ??? BYTE??? rgbReserved; }RGBQUAD, *PRGBQUAD; 调色板数据其实告诉了显示器实际显示的时候的具体颜色,所以调色板长度是1024字节 4.最后是按行组织的图像数据,但这些数据并不是简单的按照图像的高度宽度wh的数组数据这些数据最重要的特点是 a.按行组织,每行宽度是w,但是要进行4个字节的对齐。比如如果是图像宽度是253,那么数据对齐后一行还是有256个字节。对齐可以用下面的宏来计算 #define GET_ALIGN(x)? (((x+3)/4)*4) b.图像数据是倒行的,也就是数据第一行对应图像最后一行,最后一行数据对应第一行 ?图像的实际数据之前的偏移量是sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)=14+40+1024=1078个字节。 下面是实际的BMP文件输入输函数代码 从文件读入内存代码: pw返回宽度; ph返回高度; 函数返回内存指针; /*********************************************/ unsigned char*? read_bmp(const char* pszFileName,? int* pw, int* ph) { ?BITMAPFILEHEADER bfh; ?BITMAPINFOHEADER bmh; ?FILE *fp; ?unsigned char* pImg = NULL; ?int i; ?fp=fopen(pszFileName, rb);//二进制打开 ?if(fp==NULL) return NULL; ?fread(bfh, sizeof(BITMAPFILEHEADER),1, fp); ?fread(bmh, sizeof(BITMAPINFOHEADER),1, fp); //判断是否8bit的图像 ?if(bfh.bfType!=0x4d42 bmh.biBitCount!=8) return NULL; ?pImg=(unsigned char*)malloc(bmh.biWidth*bmh.biHeight); ?*pw=bmh.biWidth; ?*ph=bmh.biHeight; ? for(i=0; ibmh.biHeight; i++) ?{ ?? fseek(fp, 1078+(bmh.biHeight-i-1)*GET_ALIGN(bmh.biWidth), SEEK_SET); ?? fread

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档