#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;

}

C语言实现BMP图像灰度化:使用fread()和fwrite()函数

原文地址: https://www.cveoy.top/t/topic/jCZw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录