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

2022-07-21,,,

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++实现bmp格式图像读写.doc》

下载本文的Word格式文档,以方便收藏与打印。