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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: c++对象内存布局示例详解