From e31678c3a2407951de3bca57578a5347abd45cbd Mon Sep 17 00:00:00 2001 From: Pedro Vicente Nunes Date: Fri, 27 Jun 2008 14:15:53 -0500 Subject: [svn-r15291] Implementation of generating more use cases (datasets of several types) for the test generator program and file Implementation of transforming 2D datasets with integer and float classes to 8bit acceptable by the jpeg library. tested: windows, linux --- tools/h52jpeg/h52jpeg.c | 68 +++++++++++-- tools/h52jpeg/h52jpegtst.c | 176 ++++++++++++++++++++++++++++++---- tools/h52jpeg/testfiles/h52jpegtst.h5 | Bin 227613 -> 947613 bytes 3 files changed, 220 insertions(+), 24 deletions(-) diff --git a/tools/h52jpeg/h52jpeg.c b/tools/h52jpeg/h52jpeg.c index 84fa145..05a3e80 100644 --- a/tools/h52jpeg/h52jpeg.c +++ b/tools/h52jpeg/h52jpeg.c @@ -69,7 +69,6 @@ static void make_jpeg_name( const char* template_name, const char* image_name, c static int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name); static void write_JPEG_file(char *filename, JSAMPLE *image_buffer, int image_height, int image_width, int planes); - /*------------------------------------------------------------------------- * Function: main * @@ -111,7 +110,7 @@ int main(int argc, const char *argv[]) image_type = opt_arg; - if ( HDstrcmp( image_type, "gray" ) == 0 ) + if ( HDstrcmp( image_type, "grey" ) == 0 ) { opt.image_type = 0; } @@ -177,7 +176,7 @@ static void usage(const char *prog) printf("\n"); - printf(" T - is a string, either or \n"); + printf(" T - is a string, either or \n"); } @@ -309,7 +308,7 @@ int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name) hsize_t planes; char interlace[20]; hssize_t npals; - void *buf=NULL; + unsigned char* buf=NULL; H5T_class_t tclass; hid_t sid; hid_t did; @@ -320,6 +319,7 @@ int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name) size_t size; hsize_t nelmts; const char* name; + size_t i; int j; int done; char jpeg_name[1024]; @@ -354,7 +354,6 @@ int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name) goto out; /* write the jpeg file */ - /* write the jpeg file */ write_JPEG_file (jpeg_name, buf, (int) height, @@ -370,6 +369,16 @@ int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name) } + + /*------------------------------------------------------------------------- + * HDF5 Image palette, ignore + *------------------------------------------------------------------------- + */ + + else if ( H5IMis_palette( fid, name ) ) + { + + } /*------------------------------------------------------------------------- * regular dataset @@ -378,6 +387,8 @@ int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name) else { + + unsigned char* image_buffer = NULL; if (( did = H5Dopen2( fid, name, H5P_DEFAULT )) < 0) goto out; @@ -416,12 +427,53 @@ int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name) if ( opt.image_type == 0 ) planes = 1; else if ( opt.image_type == 1 ) - planes = 3; + planes = 3; + + + if ( NULL == (image_buffer = HDmalloc( (size_t)nelmts * sizeof (unsigned char) ))) + { + goto out; + } + + /*------------------------------------------------------------------------- + * convert the data to unsigned char + * + *------------------------------------------------------------------------- + */ + + { + double min = DBL_MAX; + double max = -DBL_MAX; + double ratio; + + /* search for the minimum and maximum */ + for ( i = 0; i < nelmts; i++) + { + if ( buf[i] < min) min = buf[i]; + if ( buf[i] > max) max = buf[i]; + } + /* converts the data based on the ratio to a 0-255 range */ + ratio = (min == max) ? 1.0 : (double)(255.0/(max-min)); + for ( i = 0; i < nelmts; i++) + { + image_buffer[i] = (unsigned char)ceil( (( buf[i] - min ) / ratio) ); + } + + } - + /* write the jpeg file */ + write_JPEG_file (jpeg_name, + image_buffer, + (int) height, + (int) width, + (int) planes); + + free( image_buffer ); free( buf ); buf = NULL; + image_buffer = NULL; + done = 1; } @@ -504,6 +556,8 @@ void make_jpeg_name( const char* template_name, const char* image_name, char* jp } + + /* * Sample routine for JPEG compression. * diff --git a/tools/h52jpeg/h52jpegtst.c b/tools/h52jpeg/h52jpegtst.c index 3a4b277..b420168 100644 --- a/tools/h52jpeg/h52jpegtst.c +++ b/tools/h52jpeg/h52jpegtst.c @@ -15,6 +15,7 @@ #include "hdf5.h" #include "hdf5_hl.h" +#include "H5private.h" #include #include @@ -24,23 +25,72 @@ #define IMAGE2_NAME "image24bitpixel" #define PAL_NAME "palette" #define PAL_ENTRIES 256 +#define RANK 2 +#define HEIGHT 200 +#define WIDTH 300 -static int read_data(const char* file_name, hsize_t *width, hsize_t *height ); + +static int make_datasets( hid_t fid ); +static int make_images( hid_t fid ); +static int read_data(const char* file_name, hsize_t *width, hsize_t *height ); unsigned char *gbuf = 0; /* global buffer for image data */ + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: h52jpegtst main program. Generate images and datasets to be used + * by h52jpeg tests + * + * Programmer: Pedro Vicente, pvn@hdfgroup.org + * + * Date: May 30, 2008 + * + *------------------------------------------------------------------------- + */ int main( void ) { - hid_t fid; /* HDF5 file identifier */ + hid_t fid; /* HDF5 file identifier */ + + /* create a new HDF5 file using default properties. */ + if (( fid = H5Fcreate( "h52jpegtst.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT )) < 0 ) + return 1; + + /* make images */ + if ( make_images( fid ) < 0 ) + goto out; + + /* make images */ + if ( make_datasets( fid ) < 0 ) + goto out; + + /* close the file. */ + H5Fclose( fid ); + + return 0; + +out: + printf("Error on return function...Exiting\n"); + H5Fclose( fid ); + return 1; +} + +/*------------------------------------------------------------------------- + * Function: make_images + * + * Purpose: generate images + * + *------------------------------------------------------------------------- + */ + +static int make_images( hid_t fid ) +{ hsize_t width; /* width of image */ hsize_t height; /* height of image */ unsigned char pal[ PAL_ENTRIES * 3 ]; /* palette array */ hsize_t pal_dims[2] = {PAL_ENTRIES,3}; /* palette dimensions */ int i, n; - /* create a new HDF5 file using default properties. */ - if (( fid = H5Fcreate( "h52jpegtst.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT )) < 0 ) - return 1; - /* read first data file */ if ( read_data( DATA_FILE1, &width, &height ) < 0 ) goto out; @@ -50,9 +100,9 @@ int main( void ) goto out; /*------------------------------------------------------------------------- - * define a palette, blue to red tones - *------------------------------------------------------------------------- - */ + * define a palette, blue to red tones + *------------------------------------------------------------------------- + */ for ( i=0, n=0; i