c语言实现bmp图片二值化
时间: 2023-07-13 15:19:49 浏览: 94
下面是一个简单的 C 语言实现 BMP 图片二值化的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#pragma pack(push, 1)
typedef struct {
uint16_t type;
uint32_t size;
uint16_t reserved1;
uint16_t reserved2;
uint32_t offset;
} bmp_file_header_t;
typedef struct {
uint32_t size;
int32_t width;
int32_t height;
uint16_t planes;
uint16_t bit_count;
uint32_t compression;
uint32_t size_image;
int32_t x_pels_per_meter;
int32_t y_pels_per_meter;
uint32_t clr_used;
uint32_t clr_important;
} bmp_info_header_t;
#pragma pack(pop)
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s input.bmp output.bmp\n", argv[0]);
return 0;
}
FILE *input_file = fopen(argv[1], "rb");
if (!input_file) {
printf("Failed to open input file: %s\n", argv[1]);
return 0;
}
FILE *output_file = fopen(argv[2], "wb");
if (!output_file) {
printf("Failed to open output file: %s\n", argv[2]);
fclose(input_file);
return 0;
}
bmp_file_header_t file_header;
bmp_info_header_t info_header;
fread(&file_header, sizeof(bmp_file_header_t), 1, input_file);
fread(&info_header, sizeof(bmp_info_header_t), 1, input_file);
if (file_header.type != 0x4d42 ||
info_header.bit_count != 24 ||
info_header.compression != 0) {
printf("Invalid input file format.\n");
fclose(input_file);
fclose(output_file);
return 0;
}
uint32_t width = abs(info_header.width);
uint32_t height = abs(info_header.height);
uint32_t line_size = (width * 3 + 3) & ~3;
uint8_t *image_data = (uint8_t *)malloc(line_size * height);
fseek(input_file, file_header.offset, SEEK_SET);
fread(image_data, line_size, height, input_file);
file_header.size = sizeof(bmp_file_header_t) + sizeof(bmp_info_header_t) + width * height;
file_header.offset = sizeof(bmp_file_header_t) + sizeof(bmp_info_header_t);
fwrite(&file_header, sizeof(bmp_file_header_t), 1, output_file);
fwrite(&info_header, sizeof(bmp_info_header_t), 1, output_file);
uint8_t *output_data = (uint8_t *)malloc(width * height);
for (uint32_t y = 0; y < height; y++) {
for (uint32_t x = 0; x < width; x++) {
uint8_t *pixel = &image_data[y * line_size + x * 3];
uint8_t r = pixel[2];
uint8_t g = pixel[1];
uint8_t b = pixel[0];
output_data[y * width + x] = (r + g + b) / 3 > 128 ? 255 : 0;
}
}
fwrite(output_data, width * height, 1, output_file);
fclose(input_file);
fclose(output_file);
free(image_data);
free(output_data);
printf("Done.\n");
return 0;
}
```
在这个示例代码中,我们使用了两个结构体来解析 BMP 文件头和信息头的数据。在读取 BMP 文件的像素数据时,我们首先需要计算每一行像素数据的字节数(因为 BMP 文件要求每一行的字节数必须是 4 的倍数),然后使用 malloc 函数分配足够的内存来存储像素数据,最后遍历所有像素,将 RGB 值的平均值与 128 进行比较,如果大于 128,则将该像素的值设为 255,否则设为 0。
请注意,这个示例代码只适用于 24 位彩色 BMP 图片。如果你想处理其他格式的 BMP 图片,需要根据实际情况进行修改。
阅读全文