www.pudn.com > match-v3.3.src.rar > image.h


/* image.h */ 
/* Vladimir Kolmogorov (vnk@cs.cornell.edu), 2001. */ 
 
/* 
	Routines for loading and saving	standard gray (.pgm) 
	and color (.ppm) images. Also it supports unofficial 
	formats: short, long, ptr, float, double. 
 
	Tested under windows, Visual C++ 6.0 compiler 
	and unix (SunOS 5.8 and RedHat Linux 7.0, gcc and c++ compilers). 
 
	Example usage - converting color image in.ppm to gray image out.pgm: 
 
	/////////////////////////////////////////////////// 
	#include "image.h" 
 
	... 
 
	RGBImage rgb = (RGBImage) imLoad(IMAGE_RGB, "in.ppm"); 
	if (!rgb) { fprintf(stderr, "Can't open in.ppm\n"); exit(1); } 
 
	int x, y, xsize = imGetXSize(rgb), ysize = imGetYSize(rgb); 
 
	GrayImage gray = (GrayImage) imNew(IMAGE_GRAY, xsize, ysize); 
	if (!gray) { fprintf(stderr, "Not enough memory\n"); exit(1); } 
 
	for (y=0; y 
 
typedef enum 
{ 
	IMAGE_BINARY, 
	IMAGE_GRAY, 
	IMAGE_SHORT, 
	IMAGE_RGB, 
	IMAGE_LONG, 
	IMAGE_PTR, 
	IMAGE_FLOAT, 
	IMAGE_DOUBLE, 
} ImageType; 
 
typedef struct ImageHeader_st 
{ 
	ImageType		type; 
	int             data_size; 
	int				xsize, ysize; 
} ImageHeader; 
 
typedef struct GeneralImage_st { void                              *data; } *GeneralImage; 
 
typedef struct BinaryImage_st  { unsigned char                     *data; } *BinaryImage; 
typedef struct GrayImage_st    { unsigned char                     *data; } *GrayImage; 
typedef struct ShortImage_st   { short                             *data; } *ShortImage; 
typedef struct RGBImage_st     { struct { unsigned char r, g, b; } *data; } *RGBImage; 
typedef struct LongImage_st    { long                              *data; } *LongImage; 
typedef struct PtrImage_st     { void*                             *data; } *PtrImage; 
typedef struct FloatImage_st   { float                             *data; } *FloatImage; 
typedef struct DoubleImage_st  { double                            *data; } *DoubleImage; 
 
#define imHeader(im) ((ImageHeader*) ( ((char*)(im)) - sizeof(ImageHeader) )) 
 
#define imRef(im, x, y) ( ((im)+(y))->data[x] ) 
#define	imGetXSize(im)	(imHeader(im)->xsize) 
#define	imGetYSize(im)	(imHeader(im)->ysize) 
 
void * imNew(ImageType type, int xsize, int ysize); 
inline void imFree(void *im) { free(GeneralImage(im)->data); free(imHeader(im)); } 
void * imLoad(ImageType type, char *filename); 
int imSave(void *im, char *filename); 
 
 
#endif