欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-20 13:45:44
bmp格式图像有一个特点就是这类数据被分为四个部分:1.位图文件头(bitmap file header) ,大小:14字节主要包括位图文件大小和位图文件类型信息2.位图信息头(bitmap info...

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;
}

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