千家信息网

怎么用C++实现bmp格式图像读写

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要讲解了"怎么用C++实现bmp格式图像读写",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么用C++实现bmp格式图像读写"吧!bmp格式
千家信息网最后更新 2025年02月01日怎么用C++实现bmp格式图像读写

这篇文章主要讲解了"怎么用C++实现bmp格式图像读写",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么用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++实现bmp格式图像读写"的内容了,经过本文的学习后,相信大家对怎么用C++实现bmp格式图像读写这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0