C语言如何实现BMP格式图片转化为灰度
发表于:2025-11-17 作者:千家信息网编辑
千家信息网最后更新 2025年11月17日,小编给大家分享一下C语言如何实现BMP格式图片转化为灰度,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!代码如下:#include#include#include #pragma p
千家信息网最后更新 2025年11月17日C语言如何实现BMP格式图片转化为灰度
小编给大家分享一下C语言如何实现BMP格式图片转化为灰度,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
代码如下:
#include#include #include #pragma pack(1)typedef struct tagBITMAPFILEHEADER{ unsigned char bfType[2];//文件格式 unsigned long bfSize;//文件大小 unsigned short bfReserved1;//保留 unsigned short bfReserved2; unsigned long bfOffBits; //DIB数据在文件中的偏移量}fileHeader;#pragma pack()/*位图数据信息结构*/#pragma pack(1)typedef struct tagBITMAPINFOHEADER{ unsigned long biSize;//该结构的大小 long biWidth;//文件宽度 long biHeight;//文件高度 unsigned short biPlanes;//平面数 unsigned short biBitCount;//颜色位数 unsigned long biCompression;//压缩类型 unsigned long biSizeImage;//DIB数据区大小 long biXPixPerMeter; long biYPixPerMeter; unsigned long biClrUsed;//多少颜色索引表 unsigned long biClrImporant;//多少重要颜色}fileInfo;#pragma pack()/*调色板结构*/#pragma pack(1)typedef struct tagRGBQUAD{ unsigned char rgbBlue; //蓝色分量亮度 unsigned char rgbGreen;//绿色分量亮度 unsigned char rgbRed;//红色分量亮度 unsigned char rgbReserved;}rgbq;#pragma pack() int main(){ FILE *fp1 = fopen("C:\\Users\\Administrator\\Desktop\\data\\bmp\\image.bmp", "rb+"); if (fp1 == NULL) { printf("打开文件fp1失败"); exit(0); } FILE *fp2 = fopen("C:\\Users\\Administrator\\Desktop\\data\\bmp\\imageGray.bmp", "wb"); if (fp1 == NULL) { printf("打开文件fp2失败"); exit(0); } fileHeader * fh; fileInfo * fi; fh = (fileHeader *)malloc(sizeof(fileHeader)); fi = (fileInfo *)malloc(sizeof(fileInfo)); //读取位图头结构和信息头 fread(fh, sizeof(fileHeader), 1, fp1); fread(fi, sizeof(fileInfo), 1, fp1); printf("\\\\\\\\\\\\\\\\\\\\原始图片信息\\\\\\\\\\\\\\\\\\\\\\\\\\\n"); printf("bmp文件头:\n"); printf("bfSize:%d\n", fh->bfSize); printf("bfOffBits:%d\n", fh->bfOffBits); printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n"); printf("bmp信息头\n"); printf("结构体长度:%d \n", fi->biSize); printf("位图宽度:%d \n", fi->biWidth); printf("位图高度:%d \n", fi->biHeight); printf("位图平面数:%d \n", fi->biPlanes); printf("颜色位数:%d \n", fi->biBitCount); printf("压缩方式:%d \n", fi->biCompression); printf("实际位图数据占用的字节数:%d \n", fi->biSizeImage); printf("X方向分辨率:%d \n", fi->biXPixPerMeter); printf("Y方向分辨率:%d \n", fi->biYPixPerMeter); printf("使用的颜色数:%d \n", fi->biClrUsed); printf("重要颜色数:%d \n", fi->biClrImporant); printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n"); //修改信息头 fi->biBitCount = 8; //fi->biSizeImage = ((fi->biWidth * 3 + 3) / 4) * 4 * fi->biHeight; fi->biSizeImage = fi->biHeight*fi->biWidth; //修改文件头 fh->bfOffBits = sizeof(fileHeader) + sizeof(fileInfo) + 256 * sizeof(rgbq); fh->bfSize = fh->bfOffBits + fi->biSizeImage; printf("\\\\\\\\\\\\\\\\\\\\修改后的图片信息\\\\\\\\\\\\\\\\\\\\\\\\\\\n"); printf("bmp文件头:\n"); printf("bfSize:%d\n", fh->bfSize); printf("bfOffBits:%d\n", fh->bfOffBits); printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n"); printf("bmp信息头\n"); printf("结构体长度:%d \n", fi->biSize); printf("位图宽度:%d \n", fi->biWidth); printf("位图高度:%d \n", fi->biHeight); printf("位图平面数:%d \n", fi->biPlanes); printf("颜色位数:%d \n", fi->biBitCount); printf("压缩方式:%d \n", fi->biCompression); printf("实际位图数据占用的字节数:%d \n", fi->biSizeImage); printf("X方向分辨率:%d \n", fi->biXPixPerMeter); printf("Y方向分辨率:%d \n", fi->biYPixPerMeter); printf("使用的颜色数:%d \n", fi->biClrUsed); printf("重要颜色数:%d \n", fi->biClrImporant); printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n"); //创建调色板 int i,j,k=0; rgbq *fq = (rgbq *)malloc(256 * sizeof(rgbq)); for (i = 0; i<256; i++) { fq[i].rgbBlue = fq[i].rgbGreen = fq[i].rgbRed = i; } //写入文件头、信息头、调色板 fwrite(fh, sizeof(fileHeader), 1, fp2); fwrite(fi, sizeof(fileInfo), 1, fp2); fwrite(fq, sizeof(rgbq), 256, fp2); //将位图信息转为灰度 //存储bmp一行的像素点 //unsigned char ImgData[900][3]; unsigned char ImgData[3000][3]; //将灰度图像存到一维数组中 //unsigned char grayData2[900]; unsigned char ImgData2[3000]; /* //错误的算法 for (i = 0; i < fi->biHeight; i++) { for (j = 0; j < (fi->biWidth * 3 + 3) / 4 * 4; j++) { for (k = 0; k < 3; k++) { fread(&ImgData[j][k], 1, 1, fp1); } } for (j = 0; j < (fi->biWidth + 3) / 4 * 4; j++) { ImgData2[j] = int((float)ImgData[j][0] * 0.114 + (float)ImgData[j][1] * 0.587 + (float)ImgData[j][2] * 0.299); } //将灰度图信息写入 fwrite(ImgData2, j, 1, fp2); } */ /* //正确的算法(1) for (i = 0; i biHeight; i++) { for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++) { for (k = 0; k<3; k++) fread(&ImgData[j][k], 1, 1, fp1); } for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++) { ImgData2[j] = int((float)ImgData[j][0] * 0.114 + (float)ImgData[j][1] * 0.587 + (float)ImgData[j][2] * 0.299); } //将灰度图信息写入 fwrite(ImgData2, j, 1, fp2); } */ //正确算法(2) unsigned char * * bmp_data; bmp_data = new unsigned char*[fi->biHeight]; //声明一个指针数组 unsigned char *data288 = new unsigned char[fi->biHeight*fi->biWidth]; for (i = 0; i biHeight; i++) bmp_data[i] = new unsigned char[(fi->biWidth * 3 + 3) / 4 * 4]; //每个数组元素也是一个指针数组 for (i = 0; i biHeight; i++) for (j = 0; j<(fi->biWidth * 3 + 3) / 4 * 4; j++) fread(&bmp_data[i][j], 1, 1, fp1);//每次只读取一个字节,存入数组 for (i = 0; i biHeight; i++)//将24位真彩色转换成灰度图 for (j = 0; j biWidth; j++){ data288[fi->biWidth*i + j] = ((unsigned char)((float)bmp_data[i][3 * j] * 0.114 + (float)bmp_data[i][3 * j + 1] * 0.587 + (float)bmp_data[i][3 * j + 2] * 0.299)); } fwrite(data288, fi->biSizeImage, 1, fp2); free(fh); free(fi); free(fq); fclose(fp1); fclose(fp2); printf("success\n"); return 0;}


看完了这篇文章,相信你对"C语言如何实现BMP格式图片转化为灰度"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!
位图
信息
文件
颜色
灰度
结构
j++
数据
数组
图片
分辨率
方向
格式
重要
亮度
位数
分量
大小
字节
宽度
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
安徽现代软件开发参考价
网络安全周2019启动会
服务器路线回程和去程
凤凰县网络安全宣传
cpdb数据库怎么看
软件开发是一线还是二三线
想做游戏学什么专业大数据库
软件开发工作室需要办什么
数据库性能无法根据 指标来判定
互联网新生代科技
如何创建云数据库
3dm软件开发公司
嘉定区信息软件开发大概费用
计算机网络技术愿景图
Eplan建立自己的数据库
网络安全的艺术字图片
重庆梁平县苹果软件开发公司
无锡凌空网络技术有限公司
软件开发平台化
ios 网络数据库
数字货币破译数据库
外国代理服务器地址
网络安全模式杀毒多久
宝塔数据库备份有IP信息吗
网络安全与社会治理课题
net130网络技术频道
软件开发和技术开发什么区别
软件开发协议付款方式
电脑服务器制作过程
海阳阿里云服务器