#include <stdio.h> #include <stdlib.h>

#define BMP_HEADER_SIZE 54 // BMP文件头大小 #define BMP_WIDTH_OFFSET 18 // BMP图像宽度偏移量 #define BMP_HEIGHT_OFFSET 22 // BMP图像高度偏移量 #define BMP_BITCOUNT_OFFSET 28 // BMP图像每像素位数偏移量 #define BMP_DATA_OFFSET 54 // BMP图像数据偏移量

int main() { FILE *fp_in, *fp_out; unsigned char header[BMP_HEADER_SIZE]; int width, height, bitcount, row_size, i, j; unsigned char *data_in, *data_out;

// 打开输入文件
fp_in = fopen('1.bmp', 'rb');
if (fp_in == NULL) {
    printf('Error: Failed to open input file.

'); return 1; }

// 读取BMP文件头
fread(header, sizeof(unsigned char), BMP_HEADER_SIZE, fp_in);

// 获取BMP图像宽度、高度、每像素位数
width = *(int *)&header[BMP_WIDTH_OFFSET];
height = *(int *)&header[BMP_HEIGHT_OFFSET];
bitcount = *(int *)&header[BMP_BITCOUNT_OFFSET];

// 计算BMP图像每行像素字节数
row_size = ((width * bitcount + 31) / 32) * 4;

// 分配输入图像数据缓存
data_in = (unsigned char *)malloc(row_size * height);
if (data_in == NULL) {
    printf('Error: Failed to allocate memory.

'); fclose(fp_in); return 1; }

// 读取BMP图像数据
fseek(fp_in, BMP_DATA_OFFSET, SEEK_SET);
fread(data_in, sizeof(unsigned char), row_size * height, fp_in);

// 关闭输入文件
fclose(fp_in);

// 分配输出图像数据缓存
data_out = (unsigned char *)malloc(width * height);
if (data_out == NULL) {
    printf('Error: Failed to allocate memory.

'); free(data_in); return 1; }

// 将输入图像转换为灰度图像
for (i = 0; i < height; i++) {
    for (j = 0; j < width; j++) {
        int offset_in = i * row_size + j * 3;
        int offset_out = i * width + j;
        data_out[offset_out] = (data_in[offset_in] + data_in[offset_in + 1] + data_in[offset_in + 2]) / 3;
    }
}

// 打开输出文件
fp_out = fopen('2.bmp', 'wb');
if (fp_out == NULL) {
    printf('Error: Failed to open output file.

'); free(data_in); free(data_out); return 1; }

// 写入BMP文件头
fwrite(header, sizeof(unsigned char), BMP_HEADER_SIZE, fp_out);

// 写入BMP图像数据
fwrite(data_out, sizeof(unsigned char), width * height, fp_out);

// 关闭输出文件
fclose(fp_out);

// 释放内存
free(data_in);
free(data_out);

return 0;

}

C语言实现BMP图像灰度化处理(fread/fwrite)

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

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