怎么用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格式图像读写这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
位图
图像
文件
颜色
字节
像素
信息
数据
格式
大小
变量
C++
内存
结构
分量
单位
彩色
灰度
空间
学习
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全与校园安全心得体会
漳平网络安全宣传
京猫网络技术股份有限公司
太仓网络技术咨询企业
软件开发职称申请理由
国内网络安全方面的证书
固原软件开发电话
sql数据库临时表在哪里找
非规范化数据库
江苏前端软件开发服务
水桶服务器教程
网络安全认证 证书有哪些
数据库设计关系
苏州软件开发专业
mvc导出数据库数据
河北第三方软件开发价钱
学习数据库的好处
如何造自己的mc服务器
警告此服务器不安全
网络安全慕课统一入口
五歌的服务器
hp服务器产品线
转让账号导致网络安全事件案例
家用路由器服务器无响应
维护政治经济社会网络安全
服务器怎么链接
云服务器需要独立ip吗
服务器可以玩欧洲卡车吗
移动宽带访问联通服务器掉线
ai赋能软件开发