C++实现bmp格式图像读写

 更新时间:2021年10月25日 11:22:09   作者:SSS的博客  
这篇文章主要为大家详细介绍了C++实现bmp格式图像读写,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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图像

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

2.写bmp图像

bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, 
    int biBitCount, RGBQUAD *pColorTable)
{
 //如果位图数据指针为0,则没有数据传入,函数返回
 if(!imgBuf)
  return 0;
 
 //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
 int colorTablesize=0;
 if(biBitCount==8)
  colorTablesize=1024;
 
 //待存储图像数据每行字节数为4的倍数
 int lineByte=(width * biBitCount/8+3)/4*4;
 
 //以二进制写的方式打开文件
 FILE *fp=fopen(bmpName,"wb");
 if(fp==0) return 0;
 
 //申请位图文件头结构变量,填写文件头信息
 BITMAPFILEHEADER fileHead;
 fileHead.bfType = 0x4D42;//bmp类型
 
 //bfSize是图像文件4个组成部分之和
 fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
  + colorTablesize + lineByte*height;
 fileHead.bfReserved1 = 0;
 fileHead.bfReserved2 = 0;
 
 //bfOffBits是图像文件前三个部分所需空间之和
 fileHead.bfOffBits=54+colorTablesize;
 
 //写文件头进文件
 fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);
 
 //申请位图信息头结构变量,填写信息头信息
 BITMAPINFOHEADER head; 
 head.biBitCount=biBitCount;
 head.biClrImportant=0;
 head.biClrUsed=0;
 head.biCompression=0;
 head.biHeight=height;
 head.biPlanes=1;
 head.biSize=40;
 head.biSizeImage=lineByte*height;
 head.biWidth=width;
 head.biXPelsPerMeter=0;
 head.biYPelsPerMeter=0;
 //写位图信息头进内存
 fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);
 
 //如果灰度图像,有颜色表,写入文件 
 if(biBitCount==8)
  fwrite(pColorTable, sizeof(RGBQUAD),256, fp);
 
 //写位图数据进文件
 fwrite(imgBuf, height*lineByte, 1, fp);
 
 //关闭文件
 fclose(fp);
 
 return 1;
}

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

相关文章

  • C语言实现简单的五子棋游戏

    C语言实现简单的五子棋游戏

    这篇文章主要为大家详细介绍了c语言实现简单的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • win10系统VS2019配置点云库PCL1.12.1的详细流程

    win10系统VS2019配置点云库PCL1.12.1的详细流程

    这篇文章主要介绍了win10系统VS2019配置点云库PCL1.12.1的教程与经验总结,本文记录小白在配置过程中踩过的一些小坑,需要的朋友可以参考下
    2022-07-07
  • c语言中的文件加密与解密

    c语言中的文件加密与解密

    这篇文章主要介绍了c语言中的文件加密与解密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • opencv实现棋盘格检测

    opencv实现棋盘格检测

    这篇文章主要为大家详细介绍了opencv实现棋盘格检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++中inet_pton、inet_ntop函数的用法

    C++中inet_pton、inet_ntop函数的用法

    这篇文章主要介绍了C++中inet_pton、inet_ntop函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++模拟键盘按键的实例

    C++模拟键盘按键的实例

    今天小编就为大家分享一篇C++模拟键盘按键的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C语言折半查找法的超详细讲解

    C语言折半查找法的超详细讲解

    折半查找法也叫做⼆分查找,顾名思义就是把数据分成两半,再判断所查找的key在哪⼀半中,再重复上述步骤知道找到⽬标key,下面这篇文章主要给大家介绍了关于C语言折半查找法的相关资料,需要的朋友可以参考下
    2022-06-06
  • 用c语言实现《狼人杀》游戏发牌系统

    用c语言实现《狼人杀》游戏发牌系统

    大家好,本篇文章主要讲的是用c语言实现《狼人杀》游戏发牌系统,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 深入分析Visual C++进行串口通信编程的详解

    深入分析Visual C++进行串口通信编程的详解

    本篇文章是对Visual C++进行串口通信编程进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C/C++编写推箱子小游戏

    C/C++编写推箱子小游戏

    这篇文章主要为大家详细介绍了C/C++编写推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论