经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++实现bmp格式图像读写
来源:jb51  时间:2021/10/25 15:04:59  对本文有异议

bmp格式图像有一个特点就是这类数据被分为四个部分:

1.位图文件头(Bitmap File Header) ,大小:14字节

主要包括位图文件大小和位图文件类型信息

2.位图信息头(Bitmap Info Header),大小:40字节

主要包括:位图的宽度和高度,像素为单位、每个像素所占位数(1黑白图像),(4-16色图)、(8-256色图)、(24-真彩色图),新的BMP格式可以支持32位色。 还有其它水平和垂直分辨力(单位:像素/米)等  

3.颜色表(Color Map),大小:4个字节

三大类:蓝色分量、绿色分量、红色分量

4.位图数据(Data Body)

对于2色位图用1位就可以表示该像素,那么1个字节就可以储存8个像素的颜色值

对于16色位图,用4个字节表示一个像素颜色,那么一个字节可以储存2个像素颜色值

对于256色位图,1个字节刚好储存1个像素的颜色值

对于真彩色位图,则需要3个字节才能表示一个像素的颜色值

1.读bmp图像

  1. bool readBmp(char *bmpName)
  2. {
  3. //二进制读方式打开指定的图像文件
  4. FILE *fp=fopen(bmpName,"rb");
  5. if(fp==0) return 0;
  6. //跳过位图文件头结构BITMAPFILEHEADER
  7. fseek(fp, sizeof(BITMAPFILEHEADER),0);
  8. //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
  9. BITMAPINFOHEADER head;
  10. fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);
  11. //获取图像宽、高、每像素所占位数等信息
  12. bmpWidth = head.biWidth;
  13. bmpHeight = head.biHeight;
  14. biBitCount = head.biBitCount;
  15. //定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
  16. int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
  17. //灰度图像有颜色表,且颜色表表项为256
  18. if(biBitCount==8){
  19. //申请颜色表所需要的空间,读颜色表进内存
  20. pColorTable=new RGBQUAD[256];
  21. fread(pColorTable,sizeof(RGBQUAD),256,fp);
  22. }
  23. //申请位图数据所需要的空间,读位图数据进内存
  24. pBmpBuf=new unsigned char[lineByte * bmpHeight];
  25. fread(pBmpBuf,1,lineByte * bmpHeight,fp);
  26. //关闭文件
  27. fclose(fp);
  28. return 1;
  29. }

2.写bmp图像

  1. bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,
  2. int biBitCount, RGBQUAD *pColorTable)
  3. {
  4. //如果位图数据指针为0,则没有数据传入,函数返回
  5. if(!imgBuf)
  6. return 0;
  7. //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
  8. int colorTablesize=0;
  9. if(biBitCount==8)
  10. colorTablesize=1024;
  11. //待存储图像数据每行字节数为4的倍数
  12. int lineByte=(width * biBitCount/8+3)/4*4;
  13. //以二进制写的方式打开文件
  14. FILE *fp=fopen(bmpName,"wb");
  15. if(fp==0) return 0;
  16. //申请位图文件头结构变量,填写文件头信息
  17. BITMAPFILEHEADER fileHead;
  18. fileHead.bfType = 0x4D42;//bmp类型
  19. //bfSize是图像文件4个组成部分之和
  20. fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
  21. + colorTablesize + lineByte*height;
  22. fileHead.bfReserved1 = 0;
  23. fileHead.bfReserved2 = 0;
  24. //bfOffBits是图像文件前三个部分所需空间之和
  25. fileHead.bfOffBits=54+colorTablesize;
  26. //写文件头进文件
  27. fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);
  28. //申请位图信息头结构变量,填写信息头信息
  29. BITMAPINFOHEADER head;
  30. head.biBitCount=biBitCount;
  31. head.biClrImportant=0;
  32. head.biClrUsed=0;
  33. head.biCompression=0;
  34. head.biHeight=height;
  35. head.biPlanes=1;
  36. head.biSize=40;
  37. head.biSizeImage=lineByte*height;
  38. head.biWidth=width;
  39. head.biXPelsPerMeter=0;
  40. head.biYPelsPerMeter=0;
  41. //写位图信息头进内存
  42. fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);
  43. //如果灰度图像,有颜色表,写入文件
  44. if(biBitCount==8)
  45. fwrite(pColorTable, sizeof(RGBQUAD),256, fp);
  46. //写位图数据进文件
  47. fwrite(imgBuf, height*lineByte, 1, fp);
  48. //关闭文件
  49. fclose(fp);
  50. return 1;
  51. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号