diff options
Diffstat (limited to 'hl/test/test_image.c')
-rw-r--r-- | hl/test/test_image.c | 605 |
1 files changed, 551 insertions, 54 deletions
diff --git a/hl/test/test_image.c b/hl/test/test_image.c index c01dd0d..8b446b8 100644 --- a/hl/test/test_image.c +++ b/hl/test/test_image.c @@ -14,30 +14,79 @@ #include "H5IM.h" - -#define FILE_NAME "test_image.h5" -#define WIDTH (hsize_t)500 -#define HEIGHT (hsize_t)200 -unsigned char image_in1 [ WIDTH*HEIGHT ]; -unsigned char image_out1[ WIDTH*HEIGHT ]; -unsigned char image_in2 [ WIDTH*HEIGHT*3 ]; -unsigned char image_out2[ WIDTH*HEIGHT*3 ]; +#include "pal_rgb.h" +#include <stdlib.h> +#include <string.h> + +#define FILE1 "test_image1.h5" +#define FILE2 "test_image2.h5" +#define FILE3 "test_image3.h5" +#define DATA_FILE1 "image8.txt" +#define DATA_FILE2 "image24pixel.txt" +#define DATA_FILE3 "image24plane.txt" +#define DATA_FILE4 "usa.wri" +#define IMAGE1_NAME "image8bit" +#define IMAGE2_NAME "image24bitpixel" +#define IMAGE3_NAME "image24bitplane" +#define PAL_NAME "rainbow pallete" + +#define WIDTH (hsize_t)50 +#define HEIGHT (hsize_t)20 + +/* prototypes */ +static int test_simple(void); +static int test_data(void); +static int test_generate(void); +static int read_data( const char* file_name, hsize_t *width, hsize_t *height ); + +/* globals */ +unsigned char *image_data = NULL; /*------------------------------------------------------------------------- * the main program *------------------------------------------------------------------------- */ -int main( void ) + +int main(void) { - hid_t file_id; - hsize_t width, height, planes; + int nerrors=0; + + nerrors += test_simple()<0 ?1:0; + nerrors += test_data()<0 ?1:0; + nerrors += test_generate()<0 ?1:0; + + if (nerrors) goto error; + printf("All image tests passed.\n"); + return 0; + +error: + printf("***** %d IMAGE TEST%s FAILED! *****\n",nerrors, 1 == nerrors ? "" : "S"); + return 1; +} + +/*------------------------------------------------------------------------- + * a simple test that generates images and palettes + *------------------------------------------------------------------------- + */ + +static int test_simple(void) +{ + hid_t fid; + hsize_t width; + hsize_t height; + hsize_t planes; hsize_t pal_dims[] = {9,3}; hsize_t pal_dims_out[2]; - hsize_t i; char interlace[20]; hssize_t npals; - + hsize_t i; + herr_t is_image; + herr_t is_pal; + unsigned char image_in1 [ WIDTH*HEIGHT ]; + unsigned char image_out1[ WIDTH*HEIGHT ]; + unsigned char image_in2 [ WIDTH*HEIGHT*3 ]; + unsigned char image_out2[ WIDTH*HEIGHT*3 ]; unsigned char pal_data_out[9*3]; /* create a 9 entry grey palette */ unsigned char pal_data_in[9*3] = {0,0,0, @@ -55,64 +104,91 @@ int main( void ) for (i = 0; i < WIDTH*HEIGHT*3; i++) image_in2[i] = (unsigned char)i; - /* Create a new HDF5 file using default properties. */ - file_id = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT ); + /* create a file using default properties */ + if ((fid=H5Fcreate(FILE1,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT))<0) + goto out; + + + printf("Testing API functions\n"); /*------------------------------------------------------------------------- - * Indexed image test + * indexed image test *------------------------------------------------------------------------- */ - TESTING("indexed image"); + TESTING2("indexed image"); - /* Write image */ - if ( H5IMmake_image_8bit( file_id, "Image1", WIDTH, HEIGHT, image_in1 ) < 0 ) + /* write image */ + if (H5IMmake_image_8bit(fid,"image1",WIDTH,HEIGHT,image_in1)<0) goto out; - /* Make a palette */ - if ( H5IMmake_palette( file_id, "Pallete", pal_dims, pal_data_in ) < 0 ) + /* make a palette */ + if (H5IMmake_palette(fid,"palette",pal_dims,pal_data_in)<0) goto out; - /* Attach a palette to the image dataset */ - if ( H5IMlink_palette( file_id, "Image1", "Pallete" ) < 0 ) + /* attach the palette to the image dataset */ + if (H5IMlink_palette(fid,"image1","palette")<0) goto out; - /* Read image */ - if ( H5IMget_image_info( file_id, "Image1", &width, &height, &planes, interlace, &npals ) < 0 ) + /* get info */ + if (H5IMget_image_info(fid,"image1",&width,&height,&planes,interlace,&npals)<0) goto out; - if ( H5IMread_image( file_id, "Image1", image_out1 ) < 0 ) + if (width!=WIDTH) + goto out; + if (height!=HEIGHT) + goto out; + if (planes!=1) + goto out; + if (npals!=1) goto out; - for (i = 0; i < height*width*planes; i++) { - if ( image_in1[i] != image_out1[i] ) { - goto out; - + /* read image */ + if (H5IMread_image(fid,"image1",image_out1)<0) + goto out; + + /* check */ + for (i = 0; i < height*width*planes; i++) + { + if ( image_in1[i] != image_out1[i] ) + { + goto out; } } PASSED(); /*------------------------------------------------------------------------- - * True color image test + * true color image test *------------------------------------------------------------------------- */ - TESTING("true color image"); + TESTING2("true color image"); - /* Write image */ - if ( H5IMmake_image_24bit( file_id, "Image2", WIDTH, HEIGHT, "INTERLACE_PIXEL", image_in2 ) ) + /* write image */ + if (H5IMmake_image_24bit(fid,"image2",WIDTH,HEIGHT,"INTERLACE_PIXEL",image_in2)) goto out; - /* Read image */ - if ( H5IMget_image_info( file_id, "Image2", &width, &height, &planes, interlace, &npals ) < 0 ) + /* get info */ + if (H5IMget_image_info(fid,"image2",&width,&height,&planes,interlace,&npals)<0) + goto out; + + if (width!=WIDTH) + goto out; + if (height!=HEIGHT) + goto out; + if (planes!=3) goto out; - if ( H5IMread_image( file_id, "Image2", image_out2 ) < 0 ) + /* read image */ + if (H5IMread_image(fid,"image2",image_out2)<0) goto out; - for (i = 0; i < height*width*planes; i++) { - if ( image_in2[i] != image_out2[i] ) { + /* check */ + for (i = 0; i < height*width*planes; i++) + { + if ( image_in2[i] != image_out2[i] ) + { goto out; } } @@ -124,9 +200,12 @@ int main( void ) *------------------------------------------------------------------------- */ - TESTING("pallete functions"); + TESTING2("palette functions"); + + if (H5IMget_npalettes(fid,"image1",&npals)<0) + goto out; - if ( H5IMget_npalettes( file_id, "Image1", &npals ) < 0 ) + if (npals!=1) goto out; /*------------------------------------------------------------------------- @@ -134,12 +213,15 @@ int main( void ) *------------------------------------------------------------------------- */ - if ( H5IMget_palette_info( file_id, "Image1", 0, pal_dims_out ) < 0 ) + if (H5IMget_palette_info(fid,"image1",0,pal_dims_out)<0) goto out; - for (i = 0; i < 2; i++) { - if ( pal_dims[i] != pal_dims_out[i] ) { - goto out; + /* check */ + for (i = 0; i < 2; i++) + { + if ( pal_dims[i] != pal_dims_out[i] ) + { + goto out; } } @@ -148,11 +230,14 @@ int main( void ) *------------------------------------------------------------------------- */ - if ( H5IMget_palette( file_id, "Image1", 0, pal_data_out ) < 0 ) + if (H5IMget_palette(fid,"image1",0,pal_data_out)<0) goto out; - for (i = 0; i < 9*3; i++) { - if ( pal_data_in[i] != pal_data_out[i] ) { + /* check */ + for (i = 0; i < 9*3; i++) + { + if ( pal_data_in[i] != pal_data_out[i] ) + { goto out; } } @@ -162,10 +247,16 @@ int main( void ) *------------------------------------------------------------------------- */ - if ( H5IMis_image( file_id, "Image1" ) < 0 ) + if ((is_image=H5IMis_image(fid,"image1"))<0) + goto out; + + if (is_image!=1) + goto out; + + if ((is_image=H5IMis_image(fid,"image2"))<0) goto out; - if ( H5IMis_image( file_id, "Image2" ) < 0 ) + if (is_image!=1) goto out; /*------------------------------------------------------------------------- @@ -173,22 +264,428 @@ int main( void ) *------------------------------------------------------------------------- */ - if ( H5IMis_palette( file_id, "Pallete" ) < 0 ) + if ((is_pal=H5IMis_palette(fid,"palette"))<0) goto out; + if (is_pal!=1) + goto out; + + PASSED(); + /*------------------------------------------------------------------------- - * end tests + * close + *------------------------------------------------------------------------- + */ + if (H5Fclose(fid)<0) + goto out; + + return 0; + + /* error zone, gracefully close */ +out: + H5E_BEGIN_TRY { + H5Fclose(fid); + } H5E_END_TRY; + H5_FAILED(); + return FAIL; +} + + +/*------------------------------------------------------------------------- + * read sample realistic image data from ASCII files + *------------------------------------------------------------------------- + */ + +static int test_data(void) +{ + hid_t fid; + hsize_t pal_dims[2]; + char *srcdir = getenv("srcdir"); /* the source directory */ + char data_file[512]=""; /* buffer to hold name of existing data file */ + hsize_t width; + hsize_t height; + + /* create a file using default properties */ + if ((fid=H5Fcreate(FILE2,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT))<0) + goto out; + + printf("Testing read ascii image data and generate images\n"); + +/*------------------------------------------------------------------------- + * read 8bit image data + *------------------------------------------------------------------------- + */ + + TESTING2("make indexed image"); + + strcpy(data_file, ""); + /* compose the name of the file to open, using the srcdir, if appropriate */ + if (srcdir) + { + strcpy(data_file, srcdir); + strcat(data_file, "/"); + } + /* read first data file */ + strcat(data_file,DATA_FILE1); + if ((read_data(data_file,&width,&height))<0) + goto out; + + /* make an image */ + if ((H5IMmake_image_8bit(fid,IMAGE1_NAME,width,height,image_data))<0) + goto out; + + /* initialize the palette data; pal_rgb data is contained in "pal_rgb.h" */ + pal_dims[0] = 256; + pal_dims[1] = 3; + + /* make a palette */ + if ((H5IMmake_palette(fid,PAL_NAME,pal_dims,pal_rgb))<0) + goto out; + + /* attach a palette to the image dataset */ + if ((H5IMlink_palette(fid,IMAGE1_NAME,PAL_NAME))<0) + goto out; + + PASSED(); + + +/*------------------------------------------------------------------------- + * true color image example with pixel interlace + *------------------------------------------------------------------------- + */ + + TESTING2("make true color image with pixel interlace"); + + /* read second data file */ + strcpy(data_file, ""); + /* compose the name of the file to open, using the srcdir, if appropriate */ + if ( srcdir ) + { + strcpy(data_file, srcdir); + strcat(data_file, "/"); + } + strcat( data_file, DATA_FILE2); + if ((read_data(data_file,&width,&height))<0) + goto out; + + /* make image */ + if ((H5IMmake_image_24bit(fid,IMAGE2_NAME,width,height,"INTERLACE_PIXEL",image_data))<0) + goto out; + + PASSED(); + +/*------------------------------------------------------------------------- + * True color image example with plane interlace *------------------------------------------------------------------------- */ - /* Close the file. */ - if(H5Fclose( file_id ) < 0) goto out; + TESTING2("make true color image with plane interlace"); + + /* read third data file */ + strcpy(data_file, ""); + /* compose the name of the file to open, using the srcdir, if appropriate */ + if ( srcdir ) + { + strcpy(data_file, srcdir); + strcat(data_file, "/"); + } + strcat( data_file, DATA_FILE3); + if ((read_data(data_file,&width,&height))<0) + goto out; + + /* make image */ + if ((H5IMmake_image_24bit(fid,IMAGE3_NAME,width,height,"INTERLACE_PLANE",image_data))<0) + goto out; PASSED(); + + +/*------------------------------------------------------------------------- + * close + *------------------------------------------------------------------------- + */ + if (H5Fclose(fid)<0) + goto out; + return 0; + + /* error zone, gracefully close */ +out: + H5E_BEGIN_TRY { + H5Fclose(fid); + } H5E_END_TRY; + H5_FAILED(); + return FAIL; +} + + + /* + The following test provides an examples of how to generate HDF5 image data from + floating point data. In the example we use real life topographic data + (from the North American hemisphere). In the dataset sea values are represented + as negative numbers and land values are represented as positive numbers. + The example generates 3 HDF5 images, one that generates an image from all the values, + another that generates an image from the land values and another that generates an + image from the sea values. + For the example we used data from MODB, the Mediterranean Oceanic Data Base + http://modb.oce.ulg.ac.be/ + +*/ + +static int test_generate(void) +{ + hid_t fid; + hsize_t pal_dims[2] = { 256, 3 }; + float *data; + int imax, jmax, kmax; + float valex, xmin, xmax, value; + FILE *f; + char *srcdir = getenv("srcdir"); /* the source directory */ + char data_file[512]=""; /* buffer to hold name of existing data file */ + int i; + + /* create a file using default properties */ + if ((fid=H5Fcreate(FILE3,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT))<0) + goto out; + printf("Testing read and process data and make indexed images\n"); + +/*------------------------------------------------------------------------- + * read data; the file data format is described below + *------------------------------------------------------------------------- + */ + + /* compose the name of the file to open, using the srcdir, if appropriate */ + if ( srcdir ) + { + strcpy(data_file, srcdir); + strcat(data_file, "/"); + } + strcat(data_file,DATA_FILE4); + + /* Read data file */ + f = fopen( data_file, "r" ) ; + + if ( f == NULL ) + { + printf( "Could not find file %s. Try set $srcdir \n", DATA_FILE4 ); + H5Fclose(fid); + return -1; + } + +/* +!The first line of the ASCII file contains the dimension of the array : +! IMAX, JMAX, KMAX. The integers are stored with the FORTRAN format I5. +!The second line contains the exclusion value, the minimum and the maximum value of this +! file. These numbers are stored with the FORTRAN format E12.5. +! The remaining lines contains the data of the array, with 5 numbers per line +! (except the last line for each I-line). +! The array is stored in horizontal slices from sea surface to sea bottom and from +! north to south. So the indexes go from : +! +! DO K = KMAX to 1 +! DO J = JMAX to 1 +! DO I = 1 to IMAX +! read +! OD +! OD +! OD +! +! ____________________________ +! / /| (imax,jmax,kmax) +! / sea surface / | +! / / | +! /__________________________ / | +! | | | +! | | | (imax,jmax,1) n +! | | / / +! | | / / +! ^ j | | / w <-----o-----> e +! k | / |__________________________|/ / +! | / (imax,1,1) / +! |----------> s +! i +! +*/ + + + fscanf( f, "%d %d %d", &imax, &jmax, &kmax ); + fscanf( f, "%f %f %f", &valex, &xmin, &xmax ); + + data = (float*) malloc ( imax * jmax * kmax * sizeof( float )); + image_data = (unsigned char*) malloc ( imax * jmax * kmax * sizeof( unsigned char )); + + for ( i = 0; i < imax * jmax * kmax; i++ ) + { + fscanf( f, "%f ", &value ); + data[i] = value; + } + fclose( f ); + +/*------------------------------------------------------------------------- + * transform the data from floating point to unsigend char + * we are processing all the data here + *------------------------------------------------------------------------- + */ + + TESTING2("make indexed image from all the data"); + + for ( i = 0; i < imax * jmax * kmax; i++ ) + { + image_data[i] = (unsigned char)(( 255 * (data[i] - xmin ) ) / (xmax - xmin )); + } + + /* Make the image */ + if ((H5IMmake_image_8bit(fid,"All data",(hsize_t)imax,(hsize_t)jmax,image_data))<0) + goto out; + + PASSED(); + +/*------------------------------------------------------------------------- + * transform the data from floating point to unsigend char + * here we just process the land data + *------------------------------------------------------------------------- + */ + + TESTING2("make indexed image from land data"); + + for ( i = 0; i < imax * jmax * kmax; i++ ) + { + if ( data[i] < 0 ) + image_data[i] = 0; + else + image_data[i] = (unsigned char)(( 255 * (data[i] ) ) / xmax ); + } + + /* make the image */ + if ((H5IMmake_image_8bit(fid,"Land data",(hsize_t)imax,(hsize_t)jmax,image_data))<0) + goto out; + + PASSED(); + +/*------------------------------------------------------------------------- + * transform the data from floating point to unsigend char + * here we just process the sea data + *------------------------------------------------------------------------- + */ + + TESTING2("make indexed image from sea data"); + + for ( i = 0; i < imax * jmax * kmax; i++ ) + { + if ( data[i] > 0 ) + image_data[i] = 0; + else + image_data[i] = (unsigned char)(( 255 * (data[i] - xmin ) ) / xmin ); + } + + /* make the image */ + if ((H5IMmake_image_8bit(fid,"Sea data",(hsize_t)imax,(hsize_t)jmax,image_data))<0) + goto out; + + PASSED(); + +/*------------------------------------------------------------------------- + * make a palette and attach it to the datasets + *------------------------------------------------------------------------- + */ + + TESTING2("attaching palettes"); + + /* make a palette */ + if ((H5IMmake_palette(fid,PAL_NAME,pal_dims,pal_rgb))<0) + goto out; + + /* Attach the palette to the image datasets */ + if ((H5IMlink_palette(fid,"All data",PAL_NAME))<0) + goto out; + if ((H5IMlink_palette(fid,"Land data",PAL_NAME))<0) + goto out; + if ((H5IMlink_palette(fid,"Sea data",PAL_NAME))<0) + goto out; + + PASSED(); + + +/*------------------------------------------------------------------------- + * close + *------------------------------------------------------------------------- + */ + if (H5Fclose(fid)<0) + goto out; + + return 0; + + /* error zone, gracefully close */ out: + H5E_BEGIN_TRY { + H5Fclose(fid); + } H5E_END_TRY; H5_FAILED(); + return FAIL; +} + + +/*------------------------------------------------------------------------- + * read_data + * utility function to read ASCII image data + * the files have a header of the type + * + * components + * n + * height + * n + * width + * n + * + * followed by the image data + * + *------------------------------------------------------------------------- + */ + +static int read_data( const char* file_name, /*IN*/ + hsize_t *width, /*OUT*/ + hsize_t *height /*OUT*/ ) +{ + int i, n; + int color_planes; + char str[20]; + FILE *f; + int w, h; + + f = fopen( file_name, "r"); + + if ( f == NULL ) + { + printf( "Could not open file %s. Try set $srcdir \n", file_name ); + return -1; + } + + fscanf( f, "%s", str ); + fscanf( f, "%d", &color_planes ); + fscanf( f, "%s", str ); + fscanf( f, "%d", &h); + fscanf( f, "%s", str ); + fscanf( f, "%d", &w); + + *width = (hsize_t)w; + *height = (hsize_t)h; + + if ( image_data ) + { + free( image_data ); + image_data=NULL; + } + + image_data = (unsigned char*) malloc (w * h * color_planes * sizeof( unsigned char )); + + for (i = 0; i < h * w * color_planes ; i++) + { + fscanf( f, "%d",&n ); + image_data[i] = (unsigned char)n; + } + fclose(f); + return 1; } |