c语言从bmp文件读入图像
时间: 2024-01-26 15:02:56 浏览: 92
下面是一个简单的 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 != 2) {
printf("Usage: %s input.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;
}
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);
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);
fclose(input_file);
// 现在 image_data 中存储了 BMP 文件中的像素数据,可以进行进一步处理
free(image_data);
printf("Done.\n");
return 0;
}
```
在这个示例代码中,我们使用了两个结构体来解析 BMP 文件头和信息头的数据。首先,我们打开 BMP 文件并读取文件头和信息头。然后,我们检查文件头和信息头是否符合要求(即文件类型必须是 "BM",颜色位数必须是 24 位,不支持压缩)。接下来,我们计算每一行像素数据的字节数,使用 malloc 函数分配足够的内存来存储像素数据,并使用 fread 函数从文件中读取像素数据。最后,我们关闭文件,并使用 free 函数释放内存。
请注意,这个示例代码只适用于 24 位彩色 BMP 图片。如果你想处理其他格式的 BMP 图片,需要根据实际情况进行修改。
阅读全文