c语言实现将bmp图转成灰度图
时间: 2025-07-05 14:59:18 浏览: 8
### 将 BMP 图像转换为灰度图像
为了将 BMP 图像转换为灰度图像,在 C 语言中可以按照以下方式处理:
#### 解析并读取 BMP 文件头和位图信息头
首先,打开并读取原始的 BMP 文件。这一步骤涉及解析文件头 (BITMAPFILEHEADER) 和位图信息头 (BITMAPINFOHEADER),以获取必要的元数据。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
} BITMAPFILEHEADER;
typedef struct {
unsigned int biSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} BITMAPINFOHEADER;
```
#### 创建新文件用于保存灰度图像
创建一个新的 BMP 文件来存储经过处理后的灰度版本图片,并复制原文件中的头部信息到新文件中去[^1]。
#### 计算每个像素的颜色分量平均值作为其对应的灰度值
遍历整个图像的数据部分,对于每一个像素点计算红(Red),绿(Green),蓝(Blue)三个通道数值加权求均值得到该位置上的亮度强度Y=Y=0.299R+0.587G+0.114B[^3]。
#### 修改像素数据区的内容
根据上述公式修改每一行扫描线所对应缓冲区内相应字节的位置处存放的新颜色值;注意由于不同操作系统可能存在的字节序差异以及某些情况下需要填充额外空白列使得每条记录长度达到四倍数的要求等问题。
#### 完整代码示例
下面是一个完整的程序框架用来完成从彩色BMP至灰度化的过程:
```c
void ConvertToGrayScale(const char* inputPath, const char* outputPath){
FILE *fpIn = fopen(inputPath, "rb");
if (!fpIn){ printf("Failed to open file.\n"); exit(-1); }
// Read headers and other necessary information here...
fseek(fpIn, bitmapFileHeader.bfOffBits, SEEK_SET);
BYTE* pixelData = malloc(bitmapInfoHeader.biSizeImage);
fread(pixelData, sizeof(BYTE), bitmapInfoHeader.biSizeImage, fpIn);
fclose(fpIn);
for(int i = 0 ;i<bitmapInfoHeader.biSizeImage;i+=3){
double grayValue = 0.299*(int)pixelData[i]+0.587*(int)pixelData[i+1]+0.114*(int)pixelData[i+2];
pixelData[i]=grayValue;
pixelData[i+1]=grayValue;
pixelData[i+2]=grayValue;
}
FILE *fpOut=fopen(outputPath,"wb+");
fwrite(&bitmapFileHeader,sizeof(BITMAPFILEHEADER),1,fpOut);
fwrite(&bitmapInfoHeader,sizeof(BITMAPINFOHEADER),1,fpOut);
fwrite(pixelData,bitmapInfoHeader.biSizeImage,1,fpOut);
free(pixelData);
fclose(fpOut);
}
```
阅读全文
相关推荐
















