C语言实现BMP图像灰度化:使用fread()和fwrite()函数
#include <stdio.h> #include <stdlib.h>
#pragma pack(2) // 结构体按2字节对齐
// bmp文件头 typedef struct { unsigned short bfType; unsigned int bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned int bfOffBits; } BMPFILEHEADER;
// bmp信息头 typedef struct { unsigned int biSize; int biWidth; int biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned int biCompression; unsigned int biSizeImage; int biXPelsPerMeter; int biYPelsPerMeter; unsigned int biClrUsed; unsigned int biClrImportant; } BMPINFOHEADER;
// 像素点 typedef struct { unsigned char b; unsigned char g; unsigned char r; } PIXEL;
int main() { FILE *fp1, *fp2; BMPFILEHEADER fileHeader; BMPINFOHEADER infoHeader; PIXEL pixel; int i, j, gray;
// 打开文件
fp1 = fopen('1.bmp', 'rb');
fp2 = fopen('2.bmp', 'wb');
// 读取文件头
fread(&fileHeader, sizeof(BMPFILEHEADER), 1, fp1);
fwrite(&fileHeader, sizeof(BMPFILEHEADER), 1, fp2);
// 读取信息头
fread(&infoHeader, sizeof(BMPINFOHEADER), 1, fp1);
fwrite(&infoHeader, sizeof(BMPINFOHEADER), 1, fp2);
// 跳过调色板
fseek(fp1, fileHeader.bfOffBits - sizeof(BMPFILEHEADER) - sizeof(BMPINFOHEADER), SEEK_CUR);
// 逐像素读取并处理
for (i = 0; i < infoHeader.biHeight; i++) {
for (j = 0; j < infoHeader.biWidth; j++) {
fread(&pixel, sizeof(PIXEL), 1, fp1);
gray = (pixel.r + pixel.g + pixel.b) / 3;
pixel.r = pixel.g = pixel.b = gray;
fwrite(&pixel, sizeof(PIXEL), 1, fp2);
}
}
// 关闭文件
fclose(fp1);
fclose(fp2);
return 0;
}
原文地址: https://www.cveoy.top/t/topic/jCZw 著作权归作者所有。请勿转载和采集!