C语言如何实现BMP图像处理
发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,这篇文章主要介绍C语言如何实现BMP图像处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R、G、B 三个分量。所以处理
千家信息网最后更新 2025年01月28日C语言如何实现BMP图像处理
这篇文章主要介绍C语言如何实现BMP图像处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R、G、B 三个分量。所以处理很简单,根据 R、G、B 的值求出 Y 值后,将 R、G、B 值都赋值成 Y,写入新图即可。 在YUV 的颜色表示方法中,Y 分量的物理含义就是亮度,它含了灰度图(grayscale)的所有信息,只用 Y 分量就完全能够表示出一幅灰度图来。YUV 和RGB 之间有着如下的对应关系:
再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的彩色变成灰度,形成新调色板,而位图数据不用动,就可以了。
以上解释来自于:《数字图像处理编程入门》,代码参考:C语言实现24位彩色图像二值化
#include#include int main(int argc, char* argv[]){ int bmpHeight; int bmpWidth; unsigned char *pBmpBuf; RGBQUAD *pColorTable; int biBitCount; //读取bmp文件 FILE *fp = fopen("./02.bmp", "rb"); if (fp == 0) return 0; fseek(fp, sizeof(BITMAPFILEHEADER), 0); BITMAPINFOHEADER head; fread(&head, 40, 1, fp); bmpHeight = head.biHeight; bmpWidth = head.biWidth; biBitCount = head.biBitCount; fseek(fp, sizeof(RGBQUAD), 1); int LineByte = (bmpWidth*biBitCount / 8 + 3) / 4 * 4;//保证每一行字节数都为4的整数倍 pBmpBuf = new unsigned char[LineByte*bmpHeight]; fread(pBmpBuf, LineByte*bmpHeight, 1, fp); fclose(fp); //将24位真彩图灰度化并保存 FILE *fp1 = fopen("gray.bmp", "wb"); if (fp1 == 0) return 0; int LineByte1 = (bmpWidth * 8 / 8 + 3) / 4 * 4; //修改文件头,其中有两项需要修改,分别为bfSize和bfOffBits BITMAPFILEHEADER bfhead; bfhead.bfType = 0x4D42; bfhead.bfSize = 14 + 40 + 256 * sizeof(RGBQUAD)+LineByte1*bmpHeight;//修改文件大小 bfhead.bfReserved1 = 0; bfhead.bfReserved2 = 0; bfhead.bfOffBits = 14 + 40 + 256 * sizeof(RGBQUAD);//修改偏移字节数 fwrite(&bfhead, 14, 1, fp1); //将修改后的文件头存入fp1; //修改信息头,其中有两项需要修改,1个位biBitCount:真彩图为24 ,应改成8;另一个是biSizeImage:由于每像素所占位数的变化,所以位图数据的大小发生变化 BITMAPINFOHEADER head1; head1.biBitCount = 8; //将每像素的位数改为8 head1.biClrImportant = 0; head1.biCompression = 0; head1.biClrUsed = 0; head1.biHeight = bmpHeight; head1.biWidth = bmpWidth; head1.biPlanes = 1; head1.biSize = 40; head1.biSizeImage = LineByte1*bmpHeight;//修改位图数据的大小 head1.biXPelsPerMeter = 0; head1.biYPelsPerMeter = 0; fwrite(&head1, 40, 1, fp1); //将修改后的信息头存入fp1; pColorTable = new RGBQUAD[256]; for (int i = 0; i < 256; i++){ pColorTable[i].rgbRed = i; pColorTable[i].rgbGreen = i; pColorTable[i].rgbBlue = i; //是颜色表里的B、G、R分量都相等,且等于索引值 } fwrite(pColorTable, sizeof(RGBQUAD), 256, fp1); //将颜色表写入fp1; //写位图数据 unsigned char *pBmpBuf1; pBmpBuf1 = new unsigned char[LineByte1*bmpHeight]; for (int i = 0; i < bmpHeight; i++){ for (int j = 0; j 实验结果分析:
实验结果分析:真彩色图不带调色板,而灰度图的调色板为256级。所以在修改调色板时需要将RGB三个分量修改为256级,根据YUV颜色空间中Y分量计算。
以上是"C语言如何实现BMP图像处理"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
调色板
分量
位图
数据
灰度
图像
处理
彩色
文件
颜色
图像处理
语言
信息
像素
大小
字节
三个
内容
篇文章
索引
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
战地5刷飞机等级服务器进不了
服务器上的表格显示自己打开了
两个系统共用一个数据库账户
网络安全邮箱管理
软件下载软件开发
网络安全法明确的四个制度
河南好的软件开发科技
网络技术交流平台现状
流动人口相关数据库
服务器批量改管理口密码
服务器安装多显卡有什么用
在数据库中内外连接的语句是
虎牙星魂rusy游戏服务器
守护网络安全你的隐私你做主
web服务器安全设置毕业论
网络安全考试网址
软件开发好不好做呀
球球英雄换服务器有什么好处么
同步更新服务器里面的程序
想学安卓软件开发易语言
网络编程中服务器模型有哪些
vb 修改 数据库
服务器上的表格显示自己打开了
行情分析软件开发设计
宽城区新时代网络安全答疑解惑
尚学堂北京软件开发
公安网络安全内容
网络安全工程职业
php数据库操作实例
语术聊天软件开发