C语言实现 BMP 图片灰度化处理
#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;
}
原文地址: https://www.cveoy.top/t/topic/jCYY 著作权归作者所有。请勿转载和采集!