PAGE 1
位图文件信息的提取和二值化处理
实验步骤:
1.拷贝MinGW文件夹至C:(路径为C:\MinGW)
2.编辑setc.bat文件,然后运行此批处理以设置路径。
3.编辑hdr.h 和hdr.c文件
4.编辑bmphdr.c文件,然后在当前文件路径下,使用DOS命令:
gcc -c hdr.c //编译,生成hdr.o目标文件
gcc -c bmphdr.c //编译,生成bmphdr.o目标文件
gcc -o bmphdr.exe hdr.o bmphdr.o//链接,生成bmphdr.exe执行文件
使用bmphdr.exe来提取某一个bmp文件的头信息,例如:
bmphdr test.bmp
5.编辑 ez.c文件(用于图像的二值化处理),然后
gcc -c ez.c //编译,生成ez.o目标文件
gcc -o ez.exe hdr.o ez.o //链接,生成ez.exe执行文件
使用 ez.exe文件来对某一个bmp文件进行二值化处理。
例如:ez test.bmp result.bmp 108 (对test.bmp文件 进行二值化处理,阈值为108,处理的结果为result.bmp文件)
hdr.h文件内容:
#ifndef __HDR_H__
#define __HDR_H__
struct bmphdr {
char signature[2];
int size;
short reserved[2];
int offset;
int hdr_size;
int width;
int height;
short nr_planes;
short bits_per_pixel;
int compress_type;
int data_size;
int resol_hori;
int resol_vert;
int nr_colors;
int important_color;
char info[1024];
};
struct bmphdr *get_header(char filename[]);
#endif
hdr.c文件内容:
#include
#include
#include "hdr.h"
struct bmphdr *get_header(char filename[])
{
FILE *fp;
struct bmphdr *hdr;
fp = fopen(filename, "rb");
if (!fp) {
printf("File open error or such file does not exist!\n");
return NULL;
}
hdr = (struct bmphdr *)malloc(sizeof(struct bmphdr));
fread(hdr->signature, 2, 1, fp);
if (hdr->signature[0] != 'B' || hdr->signature[1] != 'M') {
printf("Not a bmp file!\n");
return NULL;
}
fread(&hdr->size, 4, 1, fp);
fread(hdr->reserved, 4, 1, fp);
fread(&hdr->offset, 4, 1, fp);
fread(&hdr->hdr_size, 4, 1, fp);
fread(&hdr->width, 4, 1, fp);
fread(&hdr->height, 4, 1, fp);
fread(&hdr->nr_planes, 2, 1, fp);
fread(&hdr->bits_per_pixel, 2, 1, fp);
fread(&hdr->compress_type, 4, 1, fp);
fread(&hdr->data_size, 4, 1, fp);
fread(&hdr->resol_hori, 4, 1, fp);
fread(&hdr->resol_vert, 4, 1, fp);
fread(&hdr->nr_colors, 4, 1, fp);
fread(&hdr->important_color, 4, 1, fp);
if (hdr->offset > 54)
fread(&hdr->info, 1024, 1, fp);
fclose(fp);
return hdr;
}