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

#pragma pack(2)

typedef struct bmp_file_header { unsigned short bfType; unsigned int bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned int bfOffBits; } BMP_FILE_HEADER;

typedef struct bmp_info_header { 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; } BMP_INFO_HEADER;

typedef struct bmp_pixel { unsigned char b; unsigned char g; unsigned char r; } BMP_PIXEL;

int main() { FILE *fp_in, *fp_out; BMP_FILE_HEADER file_header; BMP_INFO_HEADER info_header; BMP_PIXEL pixel; int i, j, gray; unsigned char *data; unsigned char *gray_data;

// 打开输入文件
fp_in = fopen('1.bmp', 'rb');
if (fp_in == NULL) {
    printf('Failed to open input file!\n');
    return -1;
}

// 读取文件头
fread(&file_header, sizeof(file_header), 1, fp_in);

// 读取信息头
fread(&info_header, sizeof(info_header), 1, fp_in);

// 输出文件头和信息头
printf('File header:\n');
printf('bfType: %x\n', file_header.bfType);
printf('bfSize: %u\n', file_header.bfSize);
printf('bfReserved1: %x\n', file_header.bfReserved1);
printf('bfReserved2: %x\n', file_header.bfReserved2);
printf('bfOffBits: %u\n', file_header.bfOffBits);

printf('Info header:\n');
printf('biSize: %u\n', info_header.biSize);
printf('biWidth: %d\n', info_header.biWidth);
printf('biHeight: %d\n', info_header.biHeight);
printf('biPlanes: %d\n', info_header.biPlanes);
printf('biBitCount: %d\n', info_header.biBitCount);
printf('biCompression: %u\n', info_header.biCompression);
printf('biSizeImage: %u\n', info_header.biSizeImage);
printf('biXPelsPerMeter: %d\n', info_header.biXPelsPerMeter);
printf('biYPelsPerMeter: %d\n', info_header.biYPelsPerMeter);
printf('biClrUsed: %u\n', info_header.biClrUsed);
printf('biClrImportant: %u\n', info_header.biClrImportant);

// 分配内存
data = (unsigned char *)malloc(info_header.biSizeImage);
gray_data = (unsigned char *)malloc(info_header.biSizeImage);

// 读取像素数据
fseek(fp_in, file_header.bfOffBits, SEEK_SET);
fread(data, info_header.biSizeImage, 1, fp_in);

// 处理像素数据
for (i = 0; i < info_header.biHeight; i++) {
    for (j = 0; j < info_header.biWidth; j++) {
        pixel.b = data[i * info_header.biWidth * 3 + j * 3];
        pixel.g = data[i * info_header.biWidth * 3 + j * 3 + 1];
        pixel.r = data[i * info_header.biWidth * 3 + j * 3 + 2];
        gray = (pixel.r + pixel.g + pixel.b) / 3;
        gray_data[i * info_header.biWidth + j] = gray;
    }
}

// 打开输出文件
fp_out = fopen('2.bmp', 'wb');
if (fp_out == NULL) {
    printf('Failed to open output file!\n');
    return -1;
}

// 写入文件头和信息头
fwrite(&file_header, sizeof(file_header), 1, fp_out);
fwrite(&info_header, sizeof(info_header), 1, fp_out);

// 写入像素数据
fseek(fp_out, file_header.bfOffBits, SEEK_SET);
fwrite(gray_data, info_header.biSizeImage, 1, fp_out);

// 关闭文件
fclose(fp_in);
fclose(fp_out);

// 释放内存
free(data);
free(gray_data);

return 0;

}

C语言实现 BMP 图片灰度化处理

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

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